MurmurHash - що це?


75

Я намагався отримати на високому рівні розуміння того, що робить MurmurHash .

Я прочитав базовий опис, але ще не знайшов належного пояснення, коли і чому його використовувати. Я знаю його дуже швидко, але хочу знати трохи більше.

Я задав відповідне запитання про те, як я можу вмістити UUID в бітсет Redis, і хтось запропонував використовувати MurmurHash. Це працює, але я хотів би зрозуміти ризики / вигоди.

Відповіді:


113

Murmur - це родина хороших хеш-функцій загального призначення, придатних для некриптографічного використання. Як заявив Остін Епплбі, MurmurHash забезпечує наступні переваги:

  • простий (за кількістю сформованих інструкцій з монтажу).
  • хороший розподіл (проходження тестів хі-квадрат практично для всіх наборів ключів та розмірів сегментів.
  • хороша поведінка лавини (макс. упередження 0,5%).
  • хороша стійкість до зіткнень (проходить тест на тортури Боба Дженкіна frog.c. Неможливо зіткнення для 4-байтових ключів, не малих (1- до 7-бітних) диференціалів).
  • чудова продуктивність на апаратному забезпеченні Intel / AMD, хороший компроміс між якістю хешу та споживанням процесора.

Ви можете напевно використовувати його для хешування UUID (як і будь-яких інших розширених хеш-функцій: CityHash, Jenkins, Paul Hsieh's тощо ...). Зараз біт Redis обмежений 4 бітами (512 МБ). Отже, вам потрібно зменшити 128 біт даних (UUID) до 32 бітів (хеш-значення). Якою б не була якість функції хешування, будуть зіткнення.

Використання розробленої хеш-функції, як Murmur, дозволить максимізувати якість розподілу та мінімізувати кількість зіткнень, але жодних інших гарантій не надає.

Ось кілька посилань для порівняння якості загальних хеш-функцій:

http://www.azillionmonkeys.com/qed/hash.html

http://www.strchr.com/hash_functions

http://blog.aggregateknowledge.com/2011/12/05/choose-a-good-hash-function-part-1/

http://blog.aggregateknowledge.com/2011/12/29/choose-a-good-hash-function-part-2/

http://blog.aggregateknowledge.com/2012/02/02/choose-a-good-hash-function-part-3/


Я намагався використовувати MurmurHash для хешування моїх UUID, але хеш-функція повертає негативні ідентифікатори для деяких UUID. Хтось знає, як це обійти?
насіннєва голова

11
Результатом реалізації C MurmurHash є ціле число без знака ... воно не може бути від'ємним. Можливо, ви використовуєте Java? У Java, щоб передати підписаний int до непідписаного значення в нижніх 32 бітах довжини, потрібно AND з 0xffffffffL (див. Stackoverflow.com/questions/9578639/… )
Дідьє Спеція

Чи знаєте ви про будь-який аналіз цього хешу? Це універсально? Це 2-мудрий незалежний тощо?
Thomas Ahle

@DidierSpezia Чому Math.abs () недостатньо хороший? Результатом буде також хороший розподіл, враховуючи те, що вихідні ідентифікатори, незалежні чи ні, розподілені рівномірно.
крила

Math.abs () дійсно може бути досить хорошим ... але ви втрачаєте 1 біт, тому, ймовірно, зіткнення множиться на 2 (тобто ваш хеш має 31 біт замість 32).
Didier Spezia

-2

MurmurHash може повертати заперечне значення , початкове значення біт І проти 0x7fffffff。це значення & 0x7fffffff. Коли вхідне значення позитивне, повертається вихідне значення. Коли введене число від’ємне, повернене позитивне значення - це початкове значення біта І проти 0x7fffffff, що не є абсолютно його значенням. Примітка: Повернене значення MurmurHash не можна визначити довжиною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.