Что такое хеш-сумма и каковы её свойства?

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

Ответ

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

Основные свойства:

  1. Детерминированность: Одинаковые входные данные всегда дают одинаковую хеш-сумму.
  2. Фиксированный размер: Выходная строма имеет постоянную длину (например, MD5 — 32 hex-символа, SHA-256 — 64).
  3. Быстрота вычисления.
  4. Эффект лавины: Малейшее изменение входных данных (1 бит) полностью меняет хеш.
  5. Необратимость (стойкость к восстановлению): По хешу практически невозможно восстановить исходные данные.
  6. Устойчивость к коллизиям: Крайне мала вероятность, что разным данным соответствует одинаковый хеш.

Применение:

  • Проверка целостности данных (скачанных файлов).
  • Хеширование паролей в базах данных.
  • Построение хеш-таблиц.
  • Цифровые подписи.

Пример вычисления SHA-256 в Java:

import java.security.MessageDigest;
import java.math.BigInteger;

public class HashExample {
    public static String calculateSHA256(String input) throws Exception {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] hashBytes = md.digest(input.getBytes("UTF-8"));
        // Конвертируем байты в hex-строку
        BigInteger number = new BigInteger(1, hashBytes);
        StringBuilder hexString = new StringBuilder(number.toString(16));
        // Дополняем нулями слева
        while (hexString.length() < 64) {
            hexString.insert(0, '0');
        }
        return hexString.toString();
    }

    public static void main(String[] args) throws Exception {
        String data = "Hello, World!";
        String hash = calculateSHA256(data);
        System.out.println(hash);
        // dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f
    }
}