这种方法是按哈希表地址位数将关键字分成位数相等的几部分(最后一部分可以较短),然后将这几部分相加,舍弃最高进位后的结果就是该关键字的哈希地址。具体方法有折叠法与移位法。移位法是将分割后的每部分低位对齐相加,折叠法是从一端向另一端沿分割界来回折叠(奇数段为正序,偶数段为倒序),然后将各段相加。例如:key=12360324711202065,哈希表长度为1000,则应把关键字分成3位一段,在此舍去最低的两位65,分别进行移位叠加和折叠叠加,求得哈希地址为105和907,如图8.24所示。
(a)移位叠加(b)折叠叠加
图8.24由叠加法求哈希地址
4.除留余数法
假设哈希表长为m,p为小于等于m的最大素数,则哈希函数为
h(k)=k%p,其中%为模p取余运算。
例如,已知待散列元素为(18,75,60,43,54,90,46),表长m=10,p=7,则有
h(18)=18 % 7=4h(75)=75 % 7=5h(60)=60 % 7=4
h(43)=43 % 7=1h(54)=54 % 7=5h(90)=90 % 7=6
h(46)=46 % 7=4
此时冲突较多。为减少冲突,可取较大的m值和p值,如m=p=13,结果如下:
h(18)=18 % 13=5h(75)=75 % 13=10h(60)=60 % 13=8
h(43)=43 % 13=4h(54)=54 % 13=2h(90)=90 % 13=12
h(46)=46 % 13=7
此时没有冲突,如图8.25所示。
图8.25除留余数法求哈希地址
5.伪随机数法
采用一个伪随机函数做哈希函数,即h(key)=random(key)。
在实际应用中,应根据具体情况,灵活采用不同的方法,并用实际数据测试它的性能,以便做出正确判定。通常应考虑以下五个因素:
l计算哈希函数所需时间(简单)。
l关键字的长度。
l哈希表大小。
l关键字分布情况。
l记录查找频率
8.4.2 处理冲突的方法
通过构造性能良好的哈希函数,可以减少冲突,但一般不可能完全避免冲突,因此解决冲突是哈希法的另一个关键问题。创建哈希表和查找哈希表都会遇到冲突,两种情况下解决冲突的方法应该一致。下面以