常用的哈希函数构造方法以及常见哈希冲突解决办法


哈希函数的构造不是越复杂越好,因为往往哈希函数越复杂,取得关键字地址所消耗的时间越长,可能对哈希法性能造成一定的影响,因此选取哈希函数的时候,应该多方面权衡,选择合适的哈希函数(即不存在特别好与坏的哈希函数,需视情况而定)。

哈希函数有一个共同的性质,即哈希值应当以同等概率取其值域的每个值。

常用哈希函数构造方法:

(1)直接寻址法:取关键字或关键字的某个线性函数值作为散列地址,即 H(key) = key 或 H(key) = a * key + b,其中 a 和 b 为常数(这种散列函数叫自身函数)。

(2)数字分析法:分析一组数据,比如某班学生的出生年月日时发现出生年月日的前几位数字大体相同,这样的话,冲突的几率会很大,但是发现年月日的后几位表示月份和具体日期的数字差别较大,如果用后几位构成散列地址,则冲突的几率会明显降低。因此数字分析法是找出数字的规律,尽可能利用这些数字构造冲突几率低的散列地址。

(3)平方取中法:先通过求关键字的平方值扩大相近的差别,然后根据表长度取中间的几位数作为散列函数值。又因为一个乘积的中间几位数和乘数的每一位都相关,所以由此产生的散列地址较为均匀。

(4)除余法:该方法是最为简单常用的一种方法。它是以表长 m 来除关键字,取其余数作为散列地址,即 H(key) = key % m。该方法的关键是选取 m。选取的 m 应使得散列函数尽可能与关键字的各位相关。m 最好为素数。

(5)相乘取整法:该方法包括两个步骤,首先用关键字 key 乘上某个常数 A(0 < A < 1),并抽取出 key.A 的小数部分;然后用 m 乘以该小数后取整。

 

常见哈希冲突解决办法:

(1)开放地址法

(2)线性探测法

(3)链地址法(拉链法)

(4)二次探测法

(5)伪随机探测法

(6)再散列(双重散列,多重散列)

(7)建立一个公共溢出区


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM