Стаття у Вікіпедії про хеш-функції дуже хороша, але я тут прийму свою думку.
Що таке хеш?
"Хеш" - це дійсно широкий термін з різними формальними значеннями в різних контекстах. Немає жодної ідеальної відповіді на ваше запитання. Я поясню загальну концепцію, що лежить в основі, і згадаю деякі найпоширеніші звички цього терміна.
"Хеш" - це функція називається хеш-функцією,
яка приймає вхідні об'єкти і виводить рядок або число. Об'єкти введення зазвичай є членами основних типів даних, таких як рядки, цілі числа чи більші об'єкти, що складаються з інших об'єктів, таких як визначені користувачем структури. Вихід є типово числом або рядком. Іменник "хеш" часто посилається на цей вихід. Дієслово "хеш" часто означає "застосувати хеш-функцію". Основними властивостями, які повинна мати хеш-функція, є:год
- Він повинен бути простим для обчислення і
- Виходи повинні бути порівняно невеликими.
Приклад:
Скажімо, ми хочемо хеш-чисел у діапазоні від 0 до 999,999,999 до числа від 0 до 99. Однією простою хеш-функцією може бути .h(x)=xmod100
Загальні додаткові властивості:
Залежно від випадку використання, ми можемо бажати, щоб хеш-функція задовольняла додаткові властивості. Ось кілька загальних додаткових властивостей:
Уніфікованість : часто ми хочемо, щоб хеші об’єктів були чіткими. Більше того, ми можемо хотіти, щоб хеші були "розповсюдженнями". Якщо я хочу зафіксувати деякі об'єкти в 100 відрах (тому вихід моєї хеш-функції - це число від 0-99), я, як правило, сподіваюся, що близько 1/100 об'єктів приземляються у відрі 0, приблизно 1/100 землі в відро 1 тощо.
Криптографічний опір зіткнення : Іноді це сприймається ще далі, наприклад, у криптографії я можу захотіти хеш-функцію, щоб обчислюваче важко було знайти два різних входи, які відображають один і той же результат.
Стиснення : Я часто хочу розміщувати довільно великі входи до виходу постійного розміру або фіксованої кількості відра.
Детермінізм : я можу захотіти хеш-функцію, вихід якої не змінюється між прогонами, тобто вихід хеш-функції на одному об'єкті завжди буде однаковим. Це може здатися суперечним однаковості вище, але одне рішення полягає в тому, щоб вибрати хеш-функцію випадковим чином один раз, а не змінювати її між прогонами.
Деякі програми
Одне поширене застосування - в структурах даних, таких як хеш-таблиця, які є способом реалізації словників. Тут ви виділяєте трохи пам’яті, скажімо, 100 «відер»; потім, коли вас попросять зберегти у словнику пару (ключ, значення), ви хешуєте ключ на номер 0-99 і зберігаєте пару у відповідному відрі в пам'яті. Потім, коли вас попросять шукати ключ, ви хеш-ключ на номер 0-99 з тією ж хеш-функцією і перевірте це відро, щоб побачити, чи є цей ключ там. Якщо так, ви повертаєте його значення.
Зауважте, що ви також можете реалізовувати словники іншими способами, наприклад, з двійковим деревом пошуку (якщо ваші об'єкти порівнянні).
Ще одне практичне застосування - контрольні суми, які є способами перевірити, чи два файли однакові (наприклад, файл не був пошкоджений у попередній версії). Оскільки хеш-функції малоймовірні для відображення двох входів на один і той же вихід, ви обчислюєте та зберігаєте хеш першого файлу, як правило, представлений у вигляді рядка. Цей хеш дуже маленький, може бути лише кілька десятків символів ASCII. Потім, коли ви отримуєте другий файл, ви хешуєте це і перевіряєте, чи є вихід таким же. Якщо так, майже напевно це точно той самий файл байт-за-баєм.
Інша програма є в криптографії, де ці хеші повинні бути важко "інвертованими" - тобто, враховуючи вихід і хеш-функцію, обчислювально слід визначити вхід (и), які призвели до цього виводу. Одне використання цього стосується паролів: Замість того, щоб зберігати сам пароль, ви зберігаєте криптографічний хеш пароля (можливо, з деякими іншими інгредієнтами). Потім, коли користувач вводить пароль, ви обчислюєте його хеш і перевіряєте, чи відповідає він правильному хешу; якщо так, ви кажете, що пароль правильний. (Зараз навіть у когось, хто може шукати і дізнатися хеш, збережений на сервері, немає такого простого часу, прикидаючись користувачем.) Цей додаток може бути випадком, коли вихід такий же довший або довший, ніж вхідний, оскільки вхід такий короткий.