首页 > 代码库 > 哈希表之二哈希函数的构造

哈希表之二哈希函数的构造

了解了hash的思想之后,会发现哈希函数只是将关键字对下标的映射,没有什么特别的标准,冲突的多少就是衡量其好坏。

若对于关键字集合中的任一一个关键字,经哈希函数映像到地址集合中任何一个地址的概率是相等的,

则称此类哈希函数为均匀的(Uniform)哈希函数

如果关键字能够进过哈希函数计算得出的地址能够均匀地分布在地址区间中,就可以减少冲突。

直接定地址法 H(key)=key或H(key)=a*key+b 直接定址所得地址集合和关键字集合的大小相同,对于不同关键字不会发生冲突,但是实际使用较少
数字分析法 将关键字转为位数,取其中最不冲突的位数为哈希值,可以叠加求和然后舍去进位作为哈希值  
平方取中法  取关键字平方后的中间几位为哈希地址  一个数字平方后的中间几位和每一位都有关系,由此适用随机分布的关键字得到的哈希地址也是随机的
 折叠法  将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分叠加并舍去进位作为哈希地址  关键字位数很多,而且关键字每一位上数字分布大致均匀时,可采用折叠法得到哈希地址
 除留余数法 H(key)=key MOD p, p<=m 

 m是哈希表表长,此为最简单中最常用的构造哈希函数的方法,不仅可以直接取模,还可以通过折叠、平方取中后再取模;p的选择为质数或者不小于20的质因子的合数

 随机数法 选择一个随机函数,取关键字的随机函数值作为它的哈希地址,H(key)=random(key),其中random为随机函数   通常关键字长度不相等时采用此法构造哈希函数

 

应视不同的情况采用不同的哈希函数:

(1)计算哈希函数所需的时间(包括硬件指令的因素);

(2)关键字的长度

(3)哈希表的大小

(4)关键字的分布情况

(5)记录的查找频率

 

哈希表之二哈希函数的构造