MurmurHash - 它是啥?
Posted
技术标签:
【中文标题】MurmurHash - 它是啥?【英文标题】:MurmurHash - what is it?MurmurHash - 它是什么? 【发布时间】:2012-08-07 15:14:09 【问题描述】:我一直试图对MurmurHash 的作用有一个更高层次的理解。
我已阅读基本说明,但尚未找到关于何时使用它以及为什么使用它的良好解释。我知道它很快,但想知道更多。
我向相关的question 询问了如何将 UUID 放入 Redis 位集,有人建议使用 MurmurHash。它有效,但我想了解风险/收益。
【问题讨论】:
【参考方案1】:Murmur 是一系列良好的通用散列函数,适用于非加密用途。正如 Austin Appleby 所说,MurmurHash 提供以下好处:
简单(就生成的汇编指令的数量而言)。 良好的分布(通过了几乎所有键集和存储桶大小的卡方检验。 良好的avalanche 行为(最大偏差为 0.5%)。 良好的抗碰撞性(通过 Bob Jenkin 的 frog.c 酷刑测试。4 字节密钥不可能发生碰撞,没有小的(1 位到 7 位)差异)。 在 Intel/AMD 硬件上具有出色的性能,在哈希质量和 CPU 消耗之间取得了良好的平衡。您当然可以使用它来散列 UUID(与任何其他高级散列函数一样:CityHash、Jenkins、Paul Hsieh's 等)。现在,Redis 位集限制为 4 GB 位 (512 MB)。因此,您需要将 128 位数据(UUID)减少到 32 位(散列值)。无论散列函数的质量如何,都会发生冲突。
使用像 Murmur 这样的工程散列函数将最大限度地提高分布质量,并最大限度地减少冲突次数,但它不能提供其他保证。
以下是一些比较通用哈希函数质量的链接:
http://www.azillionmonkeys.com/qed/hash.html
http://www.strchr.com/hash_functions
http://blog.aggregateknowledge.com/2011/12/05/choosing-a-good-hash-function-part-1/
http://blog.aggregateknowledge.com/2011/12/29/choosing-a-good-hash-function-part-2/
http://blog.aggregateknowledge.com/2012/02/02/choosing-a-good-hash-function-part-3/
【讨论】:
我尝试使用 MurmurHash 对我的 UUID 进行散列,但散列函数返回的某些 UUID 的 ID 为负数。有谁知道如何解决这个问题? MurmurHash 的 C 实现的输出是一个无符号整数......它不能是负数。也许您正在使用Java?在 Java 中,要将有符号的 int 转换为 long 的底部 32 位中的无符号值,您需要与 0xffffffffL 进行 AND(参见 ***.com/questions/9578639/…) 您知道对此哈希的任何分析吗?它是通用的吗?它是 2-wise-independent 等吗? @DidierSpezia 为什么 Math.abs() 不够好?考虑到原始 id(无论是否为负)已经均匀分布,结果也将分布良好。 Math.abs() 可能确实足够好......但你失去了 1 位,所以冲突的可能性乘以 2(即你的哈希是 31 位而不是 32 位)。 【参考方案2】:MurmurHash可以返回负值,原值位与0x7fffffff。即 value & 0x7fffffff 。当输入为正时,返回原始值。当输入数字为负数时,返回的正值是原始值位与 0x7fffffff 不是绝对值。 注意:MurmurHash的返回值不能固定长度。
【讨论】:
以上是关于MurmurHash - 它是啥?的主要内容,如果未能解决你的问题,请参考以下文章