Статья в Википедии о хэш-функциях очень хороша, но здесь я дам свое мнение.
Что такое хеш?
«Хэш» - это действительно широкий термин с разными формальными значениями в разных контекстах. На ваш вопрос нет ни одного идеального ответа. Я объясню общую основную концепцию и упомяну некоторые из наиболее распространенных употреблений этого термина.
«Хеш» - это функция называемая хеш-функцией,
которая принимает в качестве входных объектов и выводит строку или число. Входные объекты обычно являются членами основных типов данных, таких как строки, целые числа или более крупные, состоящие из других объектов, таких как определяемые пользователем структуры. Вывод, как правило, представляет собой число или строку. Существительное «хэш» часто относится к этому выводу. Глагол «хэш» часто означает «применить хеш-функцию». Основные свойства, которые должна иметь хеш-функция:час
- Это должно быть легко вычислить и
- Выходы должны быть относительно небольшими.
Пример:
Скажем, мы хотим хешировать числа в диапазоне от 0 до 999 999 999 до нумерации от 0 до 99. Одна простая хеш-функция может быть .ч ( х ) = хмодификация100
Общие дополнительные свойства:
В зависимости от варианта использования мы можем захотеть, чтобы хеш-функция удовлетворяла дополнительным свойствам. Вот некоторые общие дополнительные свойства:
Однородность : часто мы хотим, чтобы хеши объектов были различимы. Более того, мы можем захотеть, чтобы хэши были «распространяющимися». Если я хочу хэшировать некоторые объекты до 100 сегментов (поэтому выходные данные моей хэш-функции представляют собой числа от 0 до 99), то я обычно надеюсь, что около 1/100 объектов попадут в сегмент 0, а около 1/100 - в ведро 1 и тд.
Сопротивление криптографическим столкновениям : иногда это делается еще дальше, например, в криптографии я могу захотеть использовать хеш-функцию так, чтобы злоумышленнику было трудно вычислить два разных входа, которые отображаются на один и тот же выход.
Сжатие : я часто хочу хэшировать произвольно большие входные данные в выходные данные постоянного размера или фиксированное количество сегментов.
Детерминизм : мне может понадобиться хеш-функция, выход которой не меняется между запусками, т. Е. Выходные данные хеш-функции для одного и того же объекта всегда будут оставаться одинаковыми. Может показаться, что это противоречит приведенной выше однородности, но одно из решений состоит в том, чтобы один раз случайно выбрать хэш-функцию, а не менять ее между запусками.
Некоторые приложения
Одним из распространенных приложений является структура данных, такая как хеш-таблица, которая является способом реализации словарей. Здесь вы выделяете некоторую память, скажем, 100 «ведер»; затем, когда вас попросят сохранить пару (ключ, значение) в словаре, вы хешируете ключ в число 0-99 и сохраните пару в соответствующем сегменте в памяти. Затем, когда вас просят найти ключ, вы хэшируете ключ на число 0-99 с той же хэш-функцией и проверяете этот сегмент, чтобы увидеть, есть ли этот ключ там. Если это так, вы возвращаете его значение.
Обратите внимание, что вы также можете реализовать словари другими способами, например, с помощью бинарного дерева поиска (если ваши объекты сопоставимы).
Другое практическое применение - это контрольные суммы, которые позволяют проверить, совпадают ли два файла (например, файл не был поврежден из предыдущей версии). Поскольку очень маловероятно, что хэш-функции отобразят два входа в один и тот же выход, вы вычисляете и сохраняете хэш первого файла, обычно представляемый в виде строки. Этот хэш очень маленький, может быть, всего несколько десятков символов ASCII. Затем, когда вы получите второй файл, вы хешируете его и проверяете, что вывод совпадает. Если это так, то почти наверняка это один и тот же файл побайтный.
Другое применение - криптография, где эти хеши должно быть трудно «инвертировать», то есть, учитывая выходные данные и хэш-функцию, должно быть вычислительно сложно определить входные данные, которые привели к этому выходу. Одно из его применений - для паролей: вместо хранения самого пароля вы храните криптографический хеш пароля (возможно, с некоторыми другими компонентами). Затем, когда пользователь вводит пароль, вы вычисляете его хеш и проверяете, соответствует ли он правильному хешу; если это так, вы говорите, пароль правильный. (Теперь даже тот, кто может посмотреть и выяснить хеш, сохраненный на сервере, не может так легко притвориться пользователем.) Это приложение может быть в том случае, когда вывод такой же длинный или более длинный, чем ввод, так как вход такой короткий.