MurmurHash
MurmurHash 是一种非加密 Hash,重点是速度和分布,不是增加碰撞难度。它适合哈希表、布隆过滤器、分片和数据去重,不适合保存密码、生成签名或者校验不可信数据。
版本
常见版本是 MurmurHash2 和 MurmurHash3。MurmurHash3 又分为 x86_32、x86_128 和 x64_128。
不同版本、位数和 Seed 得到的结果都可能不同。如果哈希值需要保存到数据库,或者用来做固定分片,需要把算法版本和 Seed 固定下来,不能只写一个 MurmurHash。
128 位版本比 32 位版本快并不是固定结论,具体速度和处理器架构、实现方式以及输入长度有关。在 64 位机器上,x64_128 通常更适合处理大量数据。
碰撞
32 位 Hash 一共只有 2^32 种结果。按照生日问题估算,均匀分布的十万个值出现至少一次碰撞的概率大约是 69%。所以数据量较大时,不应该把 32 位 Hash 当成唯一标识。
128 位的空间大得多,普通业务里出现自然碰撞的概率很低。但 Hash 相同仍然不代表原始数据相同,需要完全确认时还要比较原始内容。
使用场景
- 哈希表和布隆过滤器
- 缓存分片和一致性哈希
- 大量数据的快速初步去重
- 特征 Hash
MurmurHash 不具备抗碰撞攻击能力。输入来自外部且攻击者可以控制内容时,应使用具备防碰撞攻击能力的算法。
Redis 不同版本和不同模块使用的 Hash 算法并不完全相同,不能笼统地说 Redis 全部使用 MurmurHash。分析某个功能时,应以对应版本的源码为准。