9.4.2 构造哈希函数的方法

 四、折叠法

  若关键字的位数很多,且每一位上数字分布大致均匀,则可采用移位叠加间界叠加,即将关键字分成若干部分,然后以它们的叠加和(舍去进位)作为哈希地址。移位叠加是将分割后的每一部分的最低位对齐,然后相加;间界叠加是从一端向另一端沿分割界来回折叠,然后对齐相加。
  例如,key = 110108780428895,则其移位叠加得到的哈希地址为321,间界叠加得到的哈希地址为410。(哈希表的表长为1000)
 
   
 
 
移位叠加
间界叠加
 
   五、除留余数法

  以关键字被某个数p除后所得余数作为哈希地址。即
   Hash(key) = key MOD p

  其中,MOD表示"取模"运算,p 为不大于表长的素数或不包含小于20的质因素的合数。
 
    若p为含质因子c 的合数,则将使所有含质因子c 的关键字映象到"c 的倍数"的地址上,从而增加了冲突的可能性。
  例如,假设哈希表长为10,取 p=9,则关键字序列 {12,39,24,36,81,78,60} 对应的哈希地址依次为:3,3,6,0,0,6,6。显然,H(key)=key%9 对这组关键字不是一个"好"的哈希函数。
 
   六、随机数法

  当关键字不等长时,可取关键字的某个伪随机函数值作为哈希地址。
   Hash(key) = random(key)

  对于非数值型关键字,则需先将它们转化为数字。实际造表时,采用何种构造哈希函数的方法取决于建表的关键字集合的情况(包括关键字的范围和形态),总的原则是使产生冲突的可能性降到尽可能地小