【问题标题】:Please explain murmur hash? [closed]请解释杂音哈希? [关闭]
【发布时间】:2010-11-06 14:54:51
【问题描述】:

我刚刚发现了 murmur hash,似乎是已知最快的并且非常抗碰撞。我试图在完整的源代码中挖掘更多关于算法或实现的信息,但我很难理解它。有人可以在这里解释所使用的算法,或者在完整的源代码中实现它,最好是在 C 中。我从作者网站阅读了 C 源代码,但不知道,比如:什么是 seedhk , m?

这是什么意思? :

k *= m; 
k ^= k >> r; 
k *= m; 
    
h *= m; 
h ^= k;

data += 4;
len -= 4;

参考:http://murmurhash.googlepages.com/

【问题讨论】:

标签: algorithm hashtable collision


【解决方案1】:

代码可用 here 。 m 和 r 是算法使用的常数。 k *= m 表示取变量 k 并将其乘以 m。 k ^= k >> r 表示取 k 并右移 r 位(例如,如果 r 为 2 110101 将变为 001101),然后与 k 异或。

希望这能让你有足够的时间来完成剩下的工作。

问候

【讨论】:

    【解决方案2】:

    Murmur 算法的最佳解释在Murmur Hash Wikipedia page

    Murmur3_32(key, len, 种子) //注意:在这个版本中,所有的整数运算都被执行 //使用无符号 32 位整数。在溢出的情况下, //结果受应用程序约束 //模232算术。 c1 ← 0xcc9e2d51 c2←0x1b873593 r1 ← 15 r2 ← 13 米←5 n ← 0xe6546b64 哈希←种子 对于每四个字节的密钥 k ← 四字节块 k ← k × c1 k ← (k ROL r1) k ← k × c2 散列←散列异或k 散列←(散列 ROL r2) 哈希 ← 哈希 × m + n 任何剩余的BytesInKey 剩余字节 ← SwapEndianOrderOf(remainingBytesInKey) // 注意:端交换仅在大端机器上是必需的。 剩余字节数←剩余字节数×c1 剩余字节 ←(剩余字节 ROL r1) 剩余字节数←剩余字节数×c2 散列←散列异或剩余字节 哈希 ← 哈希 XOR len 散列←散列异或(散列SHR 16) 哈希←哈希×0x85ebca6b hash ← hash XOR (hash SRH 13) 哈希←哈希×0xc2b2ae35 散列←散列异或(散列SHR 16)

    还有我自己的:

    【讨论】:

    • 那是代码。确实,相当可读的伪代码,但我仍然不理解“解释”。我知道这些步骤在做什么,可以用多种语言编写它,但不知道每个步骤对哈希的贡献,例如,数学和东西。(我仍在四处寻找一个好的解释;不攻击这个答案或任何东西)。
    • @Noein 我刚刚添加的漂亮图片怎么样?
    • 嗯,它没有以我能理解的方式讲述数学性质……但我可能走得太远了;该图确实帮助我编写了一个版本,而不是查看实际实现,而不是伪代码,所以谢谢;)
    • 以下链接将让您深入了解作者的创作过程:sites.google.com/site/murmurhash
    • 图中第一个计算列:636f7272 和 cc9e2d51 的乘法溢出 32 位,当应用 mod32 时产生 87bd4012,而不是 0xC1AF97CE...对吗?
    猜你喜欢
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 2022-01-10
    • 2014-09-24
    • 1970-01-01
    • 2019-12-20
    • 2017-06-10
    相关资源
    最近更新 更多