什么是Hash算法?
hash算法是一种能根据投入值得到对应结果的算法,hash算法不可逆,即无法通过结果得到投入值,不同的数据投入也可能得到同样的结果(冲突碰撞,我们要避免这种碰撞)。相同的数据会得到同样的答案
Hash算法类别
常见的Hash算法如下:
直接寻址法:Hash(key)=a*key+b(a和b均为常数)线性函数
数字分析法:通过分析数据取其中分布较为均匀的几位作为结果,例如12356和12398,其中前3位位重复如果将其作为结果,将导致储存不均匀,所以取后2位,56和98
除留余数法:除以一个不大于散列表长度的数p,Hash(key)=key%p,对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。
平方取中法:将值平方取其中间几位作为结果
折叠法:每数字分组,最终加和
随机数法:选择一随机函数,取keyword的随机值作为散列地址,通经常使用于keyword长度不同的场合。
设定哈希函数为:H(key) = Random(key)其中,Random 为伪随机函数
此法适于:对长度不等的关键字构造哈希函数。
解决冲突算法
开放定址法:将冲突的Hash值作为自变量,通过某种冲突解决算法得到新的hash地址
线性探测:顺序查看下一地址直到空闲地址(会产生堆积)
平方探测法:d、d+1^2、d-1^2、d+2^2、d-2^2.。。。。依次查看直到找到空闲
再散列法(双散列法):当产生冲突时,通过新的散列法得到地址增量
伪随机法:当发生冲突时,通过伪随机数得到地址增量
拉链法:这种方法的思路是将产生冲突的元素建立一个单链表(Hash桶),并将头指针地址存储至Hash表对应桶的位置。这样定位到Hash表桶的位置后可通过遍历单链表的形式来查找元素。