Пожалуйста, объясните хеш-шепот?
Я только что узнал хрипот бормотания, кажется, самый быстрый и стойкий к столкновению. Я попытался больше вычислить алгоритм или реализацию в полном исходном коде, но мне трудно понять его. Может ли кто-нибудь здесь объяснить используемый алгоритм или реализовать его в полном исходном коде, желательно на C. Я читаю исходный код C с веб-сайта автора, но понятия не имею, например: что такое семя, h, k, m?
что это означает:
k *= m;
k ^= k >> r;
k *= m;
h *= m;
h ^= k;
data += 4;
len -= 4;
???
Ссылка: http://murmurhash.googlepages.com/
Извините за мой английский и мою глупость.
Приветствия
Ответы
Ответ 1
Код доступен здесь.
m и r - константы, используемые алгоритмом.
k * = m означает взять переменную k и умножить ее на m.
k ^ = k → r означает, что взять k и правое смещение битов r (например, если r равно 2 110101, станет 001101), а затем XOR с k.
Надеюсь, что вам будет достаточно, чтобы работать с остальными.
Привет
Ответ 2
Лучшее объяснение алгоритма Murmur находится на странице Википедии Murmur Hash:
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 232 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)
И мой собственный:
![введите описание изображения здесь]()