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.