MurmurHash

MurmurHash 是一种非加密 Hash,重点是速度和分布,不是增加碰撞难度。它适合哈希表、布隆过滤器、分片和数据去重,不适合保存密码、生成签名或者校验不可信数据。

版本

常见版本是 MurmurHash2 和 MurmurHash3。MurmurHash3 又分为 x86_32x86_128x64_128

不同版本、位数和 Seed 得到的结果都可能不同。如果哈希值需要保存到数据库,或者用来做固定分片,需要把算法版本和 Seed 固定下来,不能只写一个 MurmurHash。

128 位版本比 32 位版本快并不是固定结论,具体速度和处理器架构、实现方式以及输入长度有关。在 64 位机器上,x64_128 通常更适合处理大量数据。

碰撞

32 位 Hash 一共只有 2^32 种结果。按照生日问题估算,均匀分布的十万个值出现至少一次碰撞的概率大约是 69%。所以数据量较大时,不应该把 32 位 Hash 当成唯一标识。

128 位的空间大得多,普通业务里出现自然碰撞的概率很低。但 Hash 相同仍然不代表原始数据相同,需要完全确认时还要比较原始内容。

使用场景

  • 哈希表和布隆过滤器
  • 缓存分片和一致性哈希
  • 大量数据的快速初步去重
  • 特征 Hash

MurmurHash 不具备抗碰撞攻击能力。输入来自外部且攻击者可以控制内容时,应使用具备防碰撞攻击能力的算法。

Redis 不同版本和不同模块使用的 Hash 算法并不完全相同,不能笼统地说 Redis 全部使用 MurmurHash。分析某个功能时,应以对应版本的源码为准。

示例

一个 MurmurHash 示例

创建时间:2021-08-20
最后修改:2021-08-20

反馈