MurmurHash – 这是什么?

我一直在试图得到MurmurHash的高层次的理解。

我已经阅读了一个基本的描述,但还没有find一个很好的解释,何时使用它,为什么。 我知道它非常快,但想知道更多。

我问了一个关于如何将UUID放入Redis bitset的相关问题 ,并且有人build议使用MurmurHash。 它的工作原理,但我想了解风险/收益。

Murmur是一个很好的通用哈希函数族,适合非encryption的使用。 正如Austin Appleby所述,MurmurHash提供了以下好处:

  • 简单(根据生成的汇编指令的数量)。
  • 良好的分布(通过几乎所有的键集和桶大小的卡方检验。
  • 良好的雪崩行为(最大偏差为0.5%)。
  • 良好的碰撞阻力(通过Bob Jenkin的frog.c酷刑testing,4字节按键不会发生碰撞,不会有小的(1到7位)差分)。
  • 在Intel / AMD硬件上有很好的性能,散列质量和CPU消耗之间的折衷。

你当然可以用它来散列UUID(就像其他的高级哈希函数:CityHash,Jenkins,Paul Hsieh等等)。 现在,Redis bitset被限制为4 GB(512 MB)。 所以你需要将128位的数据(UUID)减less到32位(哈希值)。 无论哈希函数的质量如何,都会有碰撞。

使用像Murmur这样的工程哈希函数可以最大限度地提高分配的质量,并尽量减less冲突的数量,但是没有其他的保证。

以下是比较通用散列函数质量的一些链接:

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/

我知道我迟到了,但是可以帮助别人…

杂音哈希是一个非encryption散列函数 ,用于基于散列的查找 ,它使用3个基本操作,作为一个整体乘法 , 旋转和异或 。 它使用多个常量,通过传递2个基本testing来使其成为一个很好的散列函数。

  1. 雪崩testing
  2. 卡方检验

你可以看我制作的这个video,了解Murmur Hashing的详细解释。