欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

关于哈希函数

最编程 2024-06-15 15:57:30
...

哈希函数是将可变长度的数据映射到固定长度的数据的任何算法。哈希函数返回的值称为哈希摘要、哈希值、哈希代码、哈希总和、校验和,或简称为“哈希”

哈希函数主要用于生成固定长度的输出数据,作为对原始数据的缩短引用。当原始数据太麻烦而不能完整使用时,散列是有用的。

一个实际的应用是一个被称为“哈希表”的数据结构,数据和它的哈希摘要以关联的方式存储在这个结构中。在列表中搜索可变长度的字符串是很慢的,但是用于存储对在不间断时间内检索到的原始数据的引用的哈希值(排除冲突)—固定长度的哈希摘要是在数据库中建立索引的完美解决方案。

哈希函数,用于加速表查找或数据比较任务,如在数据库中查找项目、在大型文件中检测重复或相似的记录、在DNA序列中查找相似的片段以及其他数据驱动的任务。

另一个用途是密码学,即编码和保护数据的科学。从输入数据中生成哈希值很容易,验证数据与哈希值匹配也很容易,但是很难“伪造”哈希值来隐藏恶意数据。Hash sum是用于数据验证(数据完整性检查)的非常好的隐私算法背后的原理。

散列函数应该是确定性的:当它在应该被认为相等的数据块上被调用两次时(例如,包含相同字符的两个字符串),该函数应该产生相同的值。这个策略对于几乎所有基于散列的算法的正确性是至关重要的。对于哈希表,查找操作应该查看插入算法存储所查找数据的位置,因此它必须生成与输出相同的哈希值。

散列函数通常是不可逆的,这意味着不可能仅从其散列值h(x)中重建输入数据x。在许多应用程序中,几个值哈希为同一个值是很常见的,这种情况称为哈希冲突。由于冲突会导致对象的“混乱”,这会使精确的基于散列的算法更慢,粗糙的算法不太精确,现代散列算法旨在最小化冲突的概率。对于加密应用,散列函数的设计方式使得不花费大量的计算时间就不可能从散列中重建任何输入,这种函数通常被称为“单向函数”

哈希函数与校验和、校验位、指纹、随机化函数、纠错码和密码相关(并且经常与之混淆)。尽管这些概念在某种程度上有所重叠,但每一个都有自己的用途和要求,并以不同的方式进行设计和优化。例如,由美国国家药物情报中心维护的Hash Keeper数据库,与其说是哈希值,不如说是文件指纹的目录。