19

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

这是什么意思?:

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

data += 4;
len -= 4;

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

4

2 回答 2

4

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

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

问候

于 2009-06-29T08:13:19.330 回答
3

Murmur算法的最佳解释在Murmur Hash Wikipedia 页面

Murmur3_32(key, len, 种子)
    //注意:在这个版本中,所有的整数运算都被执行
    //使用无符号 32 位整数。在溢出的情况下,
    //结果受应用程序约束
    //模2 32算术。

    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)

还有我自己的:

在此处输入图像描述

于 2015-08-12T03:17:17.547 回答