Что такое хеширование в компьютерных науках?

«Что такое хеширование в компьютерных науках?» — вопрос из категории Алгоритмы и структуры данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Хеширование — это процесс преобразования входных данных произвольного размера (ключа) в фиксированную по размеру строку (хеш-код или дайджест) с помощью хеш-функции.

Требования к "хорошей" хеш-функции:

  1. Детерминированность: Один и тот же вход всегда даёт одинаковый хеш.
  2. Эффективность: Вычисление хеша должно быть быстрым (O(1) в идеале).
  3. Равномерное распределение: Хеш-коды должны равномерно распределяться по всему диапазону возможных значений, чтобы минимизировать коллизии.
  4. Устойчивость к коллизиям: Крайне сложно найти два разных входа с одинаковым хеш-кодом (особенно важно в криптографии).

Примеры и применение:

  • В структурах данных (хеш-таблицы):

    // HashMap использует hashCode() для быстрого доступа к элементам.
    Map<String, Integer> map = new HashMap<>();
    map.put("key", 10);
    // Внутри: вычисляется hash("key") -> индекс в массиве (бакете).

    Метод Object.hashCode() возвращает целочисленный хеш для использования в хеш-таблицах.

  • Проверка целостности данных:

    import java.security.MessageDigest;
    // Криптографический хеш (SHA-256) для проверки файла
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] hash = digest.digest(data);
    // Малейшее изменение 'data' полностью изменит 'hash'.
  • Кэширование: Хеш может использоваться как ключ для быстрого поиска ранее вычисленных результатов.

Коллизии: Когда два разных ключа дают одинаковый хеш. Хеш-таблицы (как HashMap) решают эту проблему с помощью цепочек (списков в бакете) или открытой адресации.

Важно: Хеш-функции для структур данных (hashCode()) и для криптографии (SHA-256) имеют разные цели и требования к безопасности.