本文概述
哈希函数用于索引原始值或键, 然后在以后每次与该值或键关联的数据被检索时使用。因此, 散列始终是单向操作。无需通过分析散列值对散列函数进行“反向工程”。
良好哈希函数的特征
- 哈希值完全由要哈希的数据确定。
- 散列函数使用所有输入数据。
- 哈希函数“均匀地”将数据分布在整个可能的哈希值集中。
- 哈希函数为相似的字符串生成复杂的哈希值。
一些流行的哈希函数是
1.除法:
选择一个小于m中的n个键的数字的m(数字m通常选择为质数或没有小除数的数字, 因为这通常是最少的碰撞次数)。
哈希函数是:
例如:如果哈希表的大小为m = 12, 并且密钥为k = 100, 则h(k)=4。由于它仅需要单个除法运算, 因此按除法进行哈希运算非常快。
2.乘法方法:
用于创建哈希函数的乘法方法分两个步骤进行。首先, 我们将密钥k乘以0 <A <1范围内的常数A, 并提取kA的小数部分。然后, 我们将该值增加m并取下限。
哈希函数是:
其中“ k A mod 1”表示k A的分数部分, 即k A-⌊kA⌋。
3.中方法:
密钥k平方。然后函数H定义为
H (k) = L
其中L是通过删除k2两端的数字获得的。我们强调必须为所有键使用相同的k2位置。
4.折叠方式:
密钥k分为多个部分k1, k2 ….. kn, 其中每个部分(除了最后一个部分)都具有与所需地址相同的位数。
然后将各部分加在一起, 而忽略最后一个进位。
H (k) = k1+ k2+.....+kn
示例:公司有68名员工, 并且每个员工都分配有唯一的四位数员工编号。假设L由2位地址组成:00、01和02 …. 99。我们将上述哈希函数应用于以下每个员工编号:
3205, 7148, 2345
(a)除法:选择一个接近99的素数m, 例如m = 97, 然后
H (3205) = 4, H (7148) = 67, H (2345) = 17.
将3205除以17得到的余数为4, 将7148除以97得到的余数为67, 将2345除以97得到的余数为17。
(b)中方法:
k = 3205 7148 2345
k2= 10272025 51093904 5499025
h (k) = 72 93 99
请注意, 从哈希算起, 选择了从右开始计数的第四和第五位。
(c)折叠方法:将密钥k分为2部分, 并相加得出以下哈希地址:
H (3205) = 32 + 50 = 82 H (7148) = 71 + 84 = 55
H (2345) = 23 + 45 = 68