Пожалуйста, объясните журчание хэш? - PullRequest
19 голосов
/ 29 июня 2009

Я только что узнал хэш ропота, похоже, самый быстрый из известных и достаточно устойчивый к столкновениям. Я пытался узнать больше об алгоритме или его реализации в полном исходном коде, но мне трудно понять его. Может ли кто-нибудь здесь объяснить используемый алгоритм или реализовать его в полном исходном коде, предпочтительно на 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/

Извините за мой английский и мою глупость. Приветствия

Ответы [ 2 ]

5 голосов
/ 12 августа 2015

Лучшее объяснение алгоритма Murmur находится на странице Murmur Hash Wikipedia :

Murmur3_32(key, len, seed)
    //Note: In this version, all integer arithmetic is performed 
    //with unsigned 32 bit integers. In the case of overflow, 
    //the result is constrained by the application 
    //of modulo 2<sup>32</sup> arithmetic.

    c1 ← 0xcc9e2d51
    c2 ← 0x1b873593
    r1 ← 15
    r2 ← 13
    m ← 5
    n ← 0xe6546b64

    hash ← seed

    for each fourByteChunk of key
        k ← fourByteChunk

        k ← k × c1
        k ← (k ROL r1)
        k ← k × c2

        hash ← hash XOR k
        hash ← (hash ROL r2)
        hash ← hash × m + n

    with any remainingBytesInKey
        remainingBytes ← SwapEndianOrderOf(remainingBytesInKey)
        // Note: Endian swapping is only necessary on big-endian machines.

        remainingBytes ← remainingBytes × c1
        remainingBytes ← (remainingBytes ROL r1)
        remainingBytes ← remainingBytes × c2

        hash ← hash XOR remainingBytes

    hash ← hash XOR len

    hash ← hash XOR (hash SHR 16)
    hash ← hash × 0x85ebca6b
    hash ← hash XOR (hash SRH 13)
    hash ← hash × 0xc2b2ae35
    hash ← hash XOR (hash SHR 16)

И мой собственный:

enter image description here

4 голосов
/ 29 июня 2009

Код доступен здесь . m и r - константы, используемые алгоритмом. k * = m означает взять переменную k и умножить ее на m. k ^ = k >> r означает взять k и сдвинуть вправо биты на r мест (например, если r равно 2, 110101 станет 001101), а затем XOR с помощью k.

Надеюсь, что этого достаточно для проработки всего остального.

Привет

...