一、概述
散列(哈希)函数的作用:将任意整数型 / 字符型关键字,通过固定运算,压缩映射为 0~表长 - 1 范围内的散列地址。构造原则(必背):
计算简单、速度快;
地址分布均匀,尽量减少哈希冲突;
能够覆盖整个散列表空间。
常用五种标准构造方法:直接定址法、除留余数法、数字分析法、平方取中法、折叠法。
二、直接定址法
- 公式
H(key)=key或H(key)=a×key+b、为常数,做线性映射。
- 原理
直接利用关键字本身,或经过简单线性变换,作为散列地址,一一对应。
- 特点
优点:无哈希冲突,计算最简单;
缺点:关键字必须连续、分布集中,若关键字跨度大,会造成散列表空间大量浪费。
- 适用场景
关键字取值连续、范围狭小、分布规律明确的场景。
三、数字分析法
- 原理
针对位数固定的数字关键字,分析每一位数字的分布规律:
剔除重复多、分布集中的无效位;
选取数字随机、分散性强的若干位,组合作为散列地址。
- 举例
一组学号:20260311、20260315、20260320前几位固定重复,中间段集中,取末尾两位作为地址,分布更均匀。
- 特点
优点:地址均匀,冲突少;
缺点:必须预先掌握全部关键字的数字规律,无法通用。
- 适用场景
关键字位数固定、样本已知、批量静态数据。
四、平方取中法
- 原理
对关键字整体进行平方运算;
平方后数值会打乱原有数字规律;
截取平方结果中间若干位作为散列地址。
- 核心优势
关键字首尾数字容易集中重复,中间位随机性最强,映射更均匀,有效降低冲突。
- 特点
优点:无需分析关键字规律,通用性强,分散效果好;
缺点:大数平方运算稍复杂,计算开销略大。
- 适用场景
关键字分布无规律、无法提前分析数位的情况。
五、折叠法
- 原理
将关键字按固定长度分割成若干段,对所有分段数值进行叠加求和,再取后几位作为散列地址。分为两种:
移位叠加:分段直接相加;
边界叠加:相邻段反向翻转后再相加,进一步打乱规律。
- 举例
关键字:5689427,按 3 位分割:568 | 942 | 7分段求和,取低位作为存储地址。
- 特点
优点:适合关键字位数多、数值范围大的数据;
缺点:分割规则需要人为设定,随机度一般。
- 适用场景
超长数字关键字、大数值编号类数据。
六、除留余数法
- 公式
H(key)=key Mod p
p 为选取的模数。
- 选取规则(必考)
设散列表表长为 m,要求:p<m;
p 优先选取质数;
避免选取含有大量公因数的合数(如偶数、5 的倍数),防止地址聚集。
- 原理
利用取模运算,将大范围关键字压缩到 0∼p−1区间,运算简单、映射稳定。
- 特点
优点:计算极简、实现容易、通用性最强、适配所有类型关键字;
缺点:若 p 选取不当,会出现地址集中、冲突增多。
- 适用场景
绝大多数散列表的默认构造方法,笔试、代码、工程全部通用。
七、五种方法整体对比总结
直接定址法:无冲突,仅限连续关键字;
数字分析法:靠数位筛选,适合已知固定样本;
平方取中法:平方乱序,中间取值,分散性好;
折叠法:分段叠加,适合长关键字;
除留余数法:万能通用,考试核心、首选方法。