Ответ
Это два связанных, но разных понятия:
- Хеш-функция — это математическая функция, которая преобразует входные данные произвольного размера в выходную битовую строку фиксированной длины. Эта строка и называется хешем.
- Хеш (или хеш-сумма) — это результат работы хеш-функции.
Ключевые свойства хороших хеш-функций:
- Детерминированность: Для одних и тех же входных данных результат (хеш) всегда будет одинаковым.
- Быстрота вычисления: Хеш должен вычисляться быстро.
- Лавинный эффект: Небольшое изменение во входных данных (даже на один бит) приводит к сильному, непредсказуемому изменению хеша.
- Стойкость к коллизиям: Практически невозможно найти два разных набора входных данных, которые давали бы одинаковый хеш.
- Необратимость (для криптографических функций): Невозможно восстановить исходные данные, имея только их хеш.
Основные области применения в бэкенде:
- Хранение паролей: В базе данных хранятся не сами пароли, а их хеши (часто с «солью»). При входе пользователя введенный пароль хешируется и сравнивается с хешем в БД.
- Проверка целостности данных: Для проверки того, что файл не был изменен при передаче, сравнивают его хеш-сумму до и после.
- Структуры данных: Хеш-таблицы (в 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
}