586 字
3 分钟
MurmurHash:一种高性能哈希函数

MurmurHash 是一种非加密哈希函数,广泛应用于高性能计算和数据处理领域。它由 Austin Appleby 在 2008 年开发,旨在提供快速且高质量的哈希值生成。MurmurHash 的设计目标是实现高速度和良好的分布特性,使其适用于各种应用场景,如哈希表、数据去重和分布式系统中的负载均衡。

它的核心思想是通过混合输入数据的位来生成哈希值,从而减少碰撞的可能性。MurmurHash 使用了一系列的位操作和乘法来混合输入数据,确保生成的哈希值具有良好的分布特性。此外,MurmurHash 还支持不同的种子值,使得同一输入数据可以生成不同的哈希值,进一步增强了其安全性和适用性。

HFT中一般在扁平哈希表中使用这个算法,从而可以减少碰撞,该算法主要有如下四个步骤:

  1. 初始化:设置一个初始的哈希值,通常是一个固定的常数。
  2. 处理输入数据:将输入数据分成固定大小的块(通常为 4 或 8 字节),并对每个块进行处理。对于每个块,使用一系列的位操作和乘法来混合数据。
  3. 处理剩余数据:如果输入数据的长度不是块大小的整数倍,处理剩余的数据,并将其混合到哈希值中。
  4. 最终化:对生成的哈希值进行最终化处理,以确保其分布均匀。
  5. 返回哈希值:返回最终生成的哈希值。

HFT中一般用最后一步的计算:

#include <cstdint>
struct ExchangeIdHasher {
// 强制内联,这几个指令会被编译器直接融合到调用处的代码中
inline size_t operator()(uint64_t k) const {
// 第一步:将高位的变化折叠到低位
k ^= k >> 33;
// 第二步:乘以一个经过严密数学测试的“魔法素数”,利用乘法的进位特性将 bit 彻底打散
k *= 0xff51afd7ed558ccdULL;
// 第三步:再次高低位混合
k ^= k >> 33;
// 第四步:乘以第二个“魔法素数”
k *= 0xc4ceb9fe1a85ec53ULL;
// 第五步:最后一次高低位混合
k ^= k >> 33;
return k;
}
};
MurmurHash:一种高性能哈希函数
https://blog.xiaobaizhang.top/posts/murmur_hash/
作者
张小白
发布于
2026-04-24
许可协议
CC BY-NC-SA 4.0