Какие свойства характеризуют хорошую хеш-функцию?

«Какие свойства характеризуют хорошую хеш-функцию?» — вопрос из категории Алгоритмы и структуры данных, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Хорошая хеш-функция должна обладать следующими ключевыми свойствами:

  1. Детерминированность: Одинаковые входные данные всегда производят одинаковый хеш.
  2. Равномерное распределение (минимизация коллизий): Выходные значения должны равномерно распределяться по всему диапазону возможных хешей, чтобы разные входы редко давали одинаковый хеш.
  3. Эффективность вычисления: Функция должна быстро работать даже на больших объемах данных.
  4. Устойчивость к коллизиям: Сложно найти два разных входа, дающих одинаковый хеш (это особенно критично для криптографических функций).
  5. Чувствительность к входным данным (лавинный эффект): Малейшее изменение входа (например, один бит) должно приводить к кардинально другому хешу.

Пример плохой хеш-функции (много коллизий):

def bad_hash(s: str) -> int:
    # Хеш зависит только от длины строки
    return len(s) % 100

Пример хорошей (некриптографической) хеш-функции: Встроенные хеш-таблицы (словари) в языках программирования используют оптимизированные функции. Например, в Python используется алгоритм, который для строк комбинирует значения символов.

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