586 字
3 分钟
MurmurHash:一种高性能哈希函数
MurmurHash 是一种非加密哈希函数,广泛应用于高性能计算和数据处理领域。它由 Austin Appleby 在 2008 年开发,旨在提供快速且高质量的哈希值生成。MurmurHash 的设计目标是实现高速度和良好的分布特性,使其适用于各种应用场景,如哈希表、数据去重和分布式系统中的负载均衡。
它的核心思想是通过混合输入数据的位来生成哈希值,从而减少碰撞的可能性。MurmurHash 使用了一系列的位操作和乘法来混合输入数据,确保生成的哈希值具有良好的分布特性。此外,MurmurHash 还支持不同的种子值,使得同一输入数据可以生成不同的哈希值,进一步增强了其安全性和适用性。
HFT中一般在扁平哈希表中使用这个算法,从而可以减少碰撞,该算法主要有如下四个步骤:
- 初始化:设置一个初始的哈希值,通常是一个固定的常数。
- 处理输入数据:将输入数据分成固定大小的块(通常为 4 或 8 字节),并对每个块进行处理。对于每个块,使用一系列的位操作和乘法来混合数据。
- 处理剩余数据:如果输入数据的长度不是块大小的整数倍,处理剩余的数据,并将其混合到哈希值中。
- 最终化:对生成的哈希值进行最终化处理,以确保其分布均匀。
- 返回哈希值:返回最终生成的哈希值。
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/