我一直试图对MurmurHash所做的事情有一个高层次的理解。
我已经阅读了基本描述,但还没有找到关于何时使用它以及为什么使用它的很好的解释。我知道它非常快,但想知道更多。
我问了一个有关如何将 UUID 放入 Redis bitset 的相关问题,有人建议使用 MurmurHash 。它有效,但我想了解风险/收益。
我一直试图对MurmurHash所做的事情有一个高层次的理解。
我已经阅读了基本描述,但还没有找到关于何时使用它以及为什么使用它的很好的解释。我知道它非常快,但想知道更多。
我问了一个有关如何将 UUID 放入 Redis bitset 的相关问题,有人建议使用 MurmurHash 。它有效,但我想了解风险/收益。
Murmur 是一系列良好的通用散列函数,适用于非加密用途。正如 Austin Appleby 所说,MurmurHash 提供以下好处:
您当然可以使用它来散列 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 可以返回负值,原值位 AND 与 0x7fffffff。即 value & 0x7fffffff 。当输入为正时,返回原值。当输入数字为负时,返回的正值是原始值位与 0x7fffffff 不是绝对值。注意:MurmurHash 的返回值不能固定长度。