MurmurHash2

MurmurHash2 - это быстрая, некриптографическая хеш-функция, созданная Остином Эпплби (Austin Appleby). Её основное назначение - эффективно генерировать 32-битные или 64-битные хеш-значения из данных произвольной длины (ключей) для использования в структурах данных типа хеш-таблиц, фильтрах Блума или распределённых системах.

Ключевые характеристики и принцип работы

  • Высокая скорость: Оптимизирован для современных процессоров, использует эффективные арифметические и битовые операции (умножение, сдвиги >>, <<, XOR ^).
  • Хорошее распределение (лавинный эффект): Малейшее изменение входных данных (даже один бит) приводит к значительному и непредсказуемому изменению выходного хеша, минимизируя коллизии для случайных данных.
  • Поточная обработка: Данные обрабатываются последовательно, блоками фиксированного размера (обычно по 4 байта для 32-битной версии).
  • "Murmur" (смешивание): Сердце алгоритма — операция m, которая интенсивно перемешивает (murmurs) текущее внутреннее состояние (хеш) с очередным блоком данных:
    • Блок умножается на константу (M).
    • Результат циклически сдвигается (ROTL).
    • Умножается на другую константу (N).
    • Выполняется операция XOR (^) с текущим значением хеша.
    • Цель: Максимально "размазать" влияние каждого входного бита по всему хешу.
  • Финальный микс (Final Mix/Avalanche): После обработки всех полных блоков оставшиеся байты (0-3 для 32-битной версии) обрабатываются отдельно. Затем выполняется серия финальных перемешивающих операций над накопленным хешем:
    • Хеш ^= (хеш >> R)
    • Хеш *= M
    • (Повторяется несколько раз с разными R и M)
    • Цель: Устранить остаточные закономерности и обеспечить сильный лавинный эффект для последних байтов.
  • Семя (Seed): Принимает начальное значение (seed), позволяя генерировать разные последовательности хешей для одного и того же набора данных. Полезно для защиты от атак на хеш-таблицы.

Коллизии

  • MurmurHash2 известен уязвимостями, позволяющими искусственно создавать коллизии (разные данные с одинаковым хешем). Это делает его непригодным для безопасности (подписи, пароли).
  • Конкретный пример пары коллизий сложен для краткости, но суть: Зная алгоритм, можно специально подобрать два разных сообщения (например, строки или бинарные данные), которые дадут одинаковый хеш MurmurHash2 при одном и том же seed. Это была одна из причин создания MurmurHash3.

Важное предупреждение

Несмотря на скорость и хорошее распределение для случайных данных, MurmurHash2 считается уязвимым к преднамеренным коллизиям. Эта уязвимость делает его небезопасным в контекстах, где злоумышленник может контролировать входные данные (например, веб-запросы, сетевые пакеты). Для таких случаев настоятельно рекомендуется использовать  криптографические хеши (SHA-256 и т.д.). MurmurHash2 уместен только в контролируемых средах, где риск искусственных коллизий минимален (например, внутренние хеш-таблицы с доверенными ключами).