哈希的英文是Hash,一般被译为散列,也被音译为哈希,把任意长度的输入通过散列算法输出,该输出值就是散列值。一般散列算法会根据输入值计算出输出应该存储的位置,这个位置如果和已经存储键值冲突则需进行重新映射。常见的散列函数有:
(1)直接取余法: f(x)=(x+MAX)mod size 其中MAX是一个比较大的数,size是存储空间
(2)平方取中法:先计算关键字的平方然后有目的的选取中间的若干位作为散列地址。若,假设散列地址范围是[000,999],k=4731则k^2=22382361取第三位至第五位作为其散列地址,则H(k)=382
(3)叠加法:把关键字分割成位数相同的几部分,如最后一部分位数不够,则左边可以空缺。
(4)基数转换法:设原关键字是十进制数,人为的当做q进制数,再转换成十进制数作为散列地址。
(5)除留余数法:设散列范围的长度为m,将关键字值k除以某数p(p<=m)以后所得的余数作为散列地址。对应的散列函数为H(k)=k mod p
处理冲突的方法:
(1)开放定址法:将散列表中“空”的地址向处理冲突开放,当散列表未满时,处理冲突需要的“下一个”空位在该散列表中解决。因此,当发生冲突时散列函数为:Di=(H(k)+di) mod m
di的取法为:
(a)1,2,3,...m-1,称线性探测再散列。
(b)1,-1