Ответ
Хеш-функция — это математическая функция, которая преобразует входные данные произвольного размера в выходную битовую строку фиксированной длины, называемую хеш-суммой или хешем.
Основные свойства хеш-функции:
- Детерминированность: Один и тот же входной набор данных всегда даёт одну и ту же хеш-сумму.
- Высокая скорость вычисления: Хеш должен вычисляться быстро для любого набора данных.
- Практическая необратимость (сопротивление прообразу): По имеющемуся хешу должно быть вычислительно невозможно восстановить исходные данные.
- Сопротивление коллизиям: Должно быть вычислительно сложно найти два разных набора входных данных, которые приводили бы к одинаковой хеш-сумме (коллизии).
Применение в бэкенде:
- Хранение паролей: Хранятся не сами пароли, а их хеши (часто с "солью" — случайными данными).
- Проверка целостности данных: Для проверки того, что файл или сообщение не были изменены при передаче.
- Кэширование: Хеш от запроса может использоваться как ключ для кэшированного ответа.
- Структуры данных: Является основой для хеш-таблиц (в Go это
map).
Пример использования sha256 в Go:
package main
import (
"crypto/sha256"
"fmt"
)
func main() {
data := []byte("hello world")
// Вычисляем хеш-сумму для наших данных
hash := sha256.Sum256(data)
// Выводим хеш в шестнадцатеричном формате
fmt.Printf("%xn", hash)
// Output: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
} Ответ 18+ 🔞
А, хеш-функции! Ну, это ж, блядь, как волшебный мясорубка, только для данных. Суёшь туда что угодно — хоть "Привет, Вася", хоть целую "Войну и мир" в текстовом файле, а на выходе получаешь, блядь, аккуратную строчку фиксированной длины, этакую цифровую отпечатку пальца. Хеш, короче.
Что от этой мясорубки требуется, чтобы она была годной:
- Чтоб не дрочилась: Одинаковые данные на входе — всегда одинаковый отпечаток на выходе. Иначе пиздец, доверия ебать ноль.
- Чтоб быстро работала: Щёлк — и готово. Не как эта, блядь, старая Windows обновляется.
- Чтоб нельзя было обратно скрутить (практически): Вот тебе отпечаток пальца — попробуй угадать, чей он, сука. Вычислительно нереально, ёпта. Это называется "сопротивление прообразу", звучит умно, а по сути — "хуй тебе, а не исходные данные".
- Чтоб сложно было подделать отпечаток: Найти два РАЗНЫХ набора данных с ОДИНАКОВЫМ хешом должно быть овердохуища сложно. Это коллизия, и хорошая хеш-функция от них защищена.
А где это всё, блядь, применяется в бэкенде?
- Пароли, эти ёбаные: Умные люди пароли в чистом виде не хранят. Хранят их хеши, да ещё и с "солью" (это не NaCl, а случайная строка). Пользователь вводит пароль — мы его хешируем и сравниваем с тем, что в базе. Даже если базу слили, пароли не узнать. Красота, блядь!
- Целостность данных: Скачал ты файл, а вдруг его по дороге вирус поправил? Берёшь хеш оригинала и сравниваешь с хешом скачанного говна. Совпало — значит, файл цел, можно спать спокойно.
- Кэширование: Хеш от запроса (URL + параметры) — отличный ключ для кэша. Быстро, удобно, в рот меня чих-пых.
- Структуры данных: Ну, хеш-таблицы,
mapв Go — их же основа, блядь, вот эти все хеш-функции. Быстрый поиск по ключу — это всё они.
Вот, смотри, как на Go покрутить эту мясорубку под названием sha256:
package main
import (
"crypto/sha256"
"fmt"
)
func main() {
data := []byte("hello world")
// Суём нашу фразу в мясорубку и крутим ручку
hash := sha256.Sum256(data)
// Выводим то, что накрутили, в читаемом виде
fmt.Printf("%xn", hash)
// Output: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
}
Вот и весь сказ. Взял данные, пропустил через функцию — получил уникальную (практически) битовую подпись. Просто, а пользы — как от хуя с винтом, то есть дохуя.