哈希

哈希基本概念

哈希(Hash)是一种将任意长度的输入数据映射为固定长度输出的技术。这个过程通过哈希函数实现,输出结果称为哈希值、散列值或摘要。

核心特性

哈希函数

哈希函数(Hash Function)是实现哈希映射的核心算法,将输入数据转换为哈希值。

数学定义

其中:

常见哈希函数类型

除法散列法(Division Method)

优点:简单快速

缺点:表大小选择很重要,最好选择质数

乘法散列法(Multiplication Method)

优点:对表大小不敏感 缺点:涉及浮点运算,可能较慢

平方取中法

字符串哈希函数

多项式滚动哈希

DJB2 哈希

FNV 哈希

密码学哈希函数

MD5

SHA-256

哈希函数的质量评估

均匀性测试

哈希冲突

当两个不同的键产生相同的哈希值时,就发生了哈希冲突(Hash Collision)。这是不可避免的现象(鸽笼原理)。

冲突产生的原因

鸽笼原理

在哈希表中:

冲突解决方法

链地址法(Separate Chaining)

每个桶维护一个链表存储所有哈希到该位置的元素。

开放地址法(Open Addressing)

所有元素都存储在哈希表本身中,冲突时寻找下一个可用位置。

线性探测(Linear Probing)

二次探测(Quadratic Probing)

双重哈希(Double Hashing)

再哈希法(Rehashing)

使用多个哈希函数,当第一个产生冲突时使用第二个,以此类推。

冲突处理

布隆过滤器(Bloom Filter)

一致性哈希(Consistent Hashing)

总结

哈希函数选择指南

应用场景推荐哈希函数特点
哈希表除法散列、乘法散列快速、简单
字符串处理多项式滚动哈希支持增量计算
密码学SHA-256, SHA-3安全性高
校验和CRC32, MD5检错能力强
分布式系统一致性哈希负载均衡

冲突处理方法比较

方法优点缺点适用场景
链地址法实现简单,负载因子可>1额外内存开销内存充足时
线性探测缓存友好,内存紧凑聚集问题负载因子较低时
二次探测减少聚集可能无法遍历所有位置中等负载因子
双重哈希分布均匀计算开销大高性能要求

Note

  1. 选择合适的哈希函数:根据数据特性选择

  2. 控制负载因子:链地址法<1.0,开放地址法<0.75

  3. 动态调整大小:及时扩容避免性能退化

  4. 考虑缓存局部性:开放地址法通常更好

  5. 安全性考虑:密码学应用使用加密哈希函数