Что такое хеш и хеш-функция? Примеры использования в Go.

Ответ

Это два связанных, но разных понятия:

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

Ключевые свойства хороших хеш-функций:

  1. Детерминированность: Для одних и тех же входных данных результат (хеш) всегда будет одинаковым.
  2. Быстрота вычисления: Хеш должен вычисляться быстро.
  3. Лавинный эффект: Небольшое изменение во входных данных (даже на один бит) приводит к сильному, непредсказуемому изменению хеша.
  4. Стойкость к коллизиям: Практически невозможно найти два разных набора входных данных, которые давали бы одинаковый хеш.
  5. Необратимость (для криптографических функций): Невозможно восстановить исходные данные, имея только их хеш.

Основные области применения в бэкенде:

  • Хранение паролей: В базе данных хранятся не сами пароли, а их хеши (часто с «солью»). При входе пользователя введенный пароль хешируется и сравнивается с хешем в БД.
  • Проверка целостности данных: Для проверки того, что файл не был изменен при передаче, сравнивают его хеш-сумму до и после.
  • Структуры данных: Хеш-таблицы (в Go это map) используют хеш-функцию для определения индекса, по которому будет храниться элемент.
  • Кэширование: Хеш от URL-адреса или тела запроса может использоваться в качестве ключа для кэширования ответа.

Пример хеширования строки в Go с помощью SHA-256:

package main

import (
    "crypto/sha256"
    "fmt"
)

func main() {
    data := "hello, world"

    // Создаем новый хешер SHA-256
    hasher := sha256.New()

    // Записываем данные в хешер
    hasher.Write([]byte(data))

    // Получаем результат в виде среза байт
    hashBytes := hasher.Sum(nil)

    // Выводим хеш в шестнадцатеричном формате
    fmt.Printf("Исходные данные: %sn", data)
    fmt.Printf("SHA-256 хеш: %xn", hashBytes)
    // Вывод: SHA-256 хеш: 09ca7e4eaa6e8ae9c7d261167129184883644d07dfba7cbfbc4c8a2e08360d5b
}