Ответ 1
Определение:
Хеширование - это приложение функции f()
к входу с переменным размером для создания выхода с постоянным размером.
A => f() => X
B => f() => Y
C => f() => Z
Хэш также является односторонней функцией, что означает, что нет функции для отмены или отмены хэша. Повторное применение хэша f(f(x))
снова не будет возвращаться к продукту x
.
Детали:
Хэш-функция может быть такой же простой, как "добавить 13 во вход" или сложной, как криптографический хэш, такой как MD5 или SHA1. Есть много вещей, которые составляют хорошую хеш-функцию, например:
- Низкая стоимость: легко вычислить
- Детерминированный: если я несколько раз нахожу вход
a
, я получаю один и тот же вывод каждый раз - Uniformity: вход будет равномерно распределен между возможными выходами. Это согласуется с тем, что называется Принцип Pigeonhole. Поскольку существует ограниченное количество выходов, мы хотим, чтобы
f()
размещал эти выходы равномерно, а не в одном и том же ковше. Когда два входа вычисляются на один и тот же вывод, это называется столкновением. Хорошо, что хеш-функция производит меньше столкновений.
Хеширование применяется к паролям:
Хеширование паролей - это тот же процесс, что и описанный выше, однако он содержит некоторые специальные соображения. Многие из свойств, которые составляют хорошую хеш-функцию, не выгодны, когда речь идет о паролях.
Возьмем, например, детерминизм, потому что хеши производят детерминированный результат, когда два человека используют один и тот же пароль, хэш будет выглядеть одинаково в хранилище паролей. Это плохо! Однако это смягчается чем-то, называемым salt.
Однородность, с другой стороны, полезна, поскольку желание алгоритма ограничить столкновения.
Поскольку хеш является односторонним, означает, что вход не может быть определен на выходе, поэтому хеширование отлично подходит для паролей!