Що саме (і саме) є "хеш?"


38

Я чув, що слово "хеш" вживається в різних контекстах (все в світі обчислень) з різними значеннями. Наприклад, у книзі Learn Python the Hard Way в главі про словники сказано, що "Python називає їх" диктатами. "Інші мови називають їх" хешами "." "Отже, чи є хешеві словники?

Інше поширене вживання слова стосується шифрування. Я також чув (і читаю) людей, які використовують слово "хеш" як специфічну функцію в рамках програмування на високому рівні.

Отже, що це саме?

Чи може хтось (з часом і хто обізнаний) люб'язно пояснити нітротичні "хеші (або хеші)"?


8
У Вікіпедії є детальні статті про хеш-таблиці та криптографічні хеш-функції . Що ви шукаєте, що не в них?
Девід Річербі

1
Ви вже перераховуєте багаторазове використання терміна "хеш", і є більше. Отже, як саме ви розраховуєте отримати відповідь "що саме це?"
Рафаель

4
"Хеші" в цьому сенсі є скороченням "хеш-таблиць", наприклад таблиць, які використовують хеші для організації ключів. Це як би називати бензин "газом" - ви не очікуєте, що "газ" буде газоподібним, а гази мають бензинові властивості, чи не так? Це відбувається постійно з мовою - зокрема, скорочення є дуже поширеними джерелами перекриття слів.
Луань

1
"Для цього слова немає визначення - ніхто не знає, що таке хеш". - Словник диявола
jpmc26

Перегляньте різні напрямки думки, що таке хеш-функція: хеш-функція - це лише якась функція з купою властивостей, але це не так, як це визначено, це актуально, це те, які властивості ми хочемо, щоб вони мали - що ми отримуємо з того, як ми хочемо використовувати функцію - це актуально. Оскільки ми хочемо використовувати його для швидкого доступу до матеріалів, ми хочемо, щоб він був ефективно обчислений. Оскільки у нас немає доступного нескінченного простору, ми хочемо, щоб кодомен був кінцевим. Оскільки ми хочемо максимально добре уникнути зіткнень, ми хочемо, щоб хеш-функція рівномірно розподіляла хеші.
Г. Бах

Відповіді:


44

Стаття у Вікіпедії про хеш-функції дуже хороша, але я тут прийму свою думку.


Що таке хеш?

"Хеш" - це дійсно широкий термін з різними формальними значеннями в різних контекстах. Немає жодної ідеальної відповіді на ваше запитання. Я поясню загальну концепцію, що лежить в основі, і згадаю деякі найпоширеніші звички цього терміна.

"Хеш" - це функція називається хеш-функцією, яка приймає вхідні об'єкти і виводить рядок або число. Об'єкти введення зазвичай є членами основних типів даних, таких як рядки, цілі числа чи більші об'єкти, що складаються з інших об'єктів, таких як визначені користувачем структури. Вихід є типово числом або рядком. Іменник "хеш" часто посилається на цей вихід. Дієслово "хеш" часто означає "застосувати хеш-функцію". Основними властивостями, які повинна мати хеш-функція, є:год

  1. Він повинен бути простим для обчислення і
  2. Виходи повинні бути порівняно невеликими.

Приклад:

Скажімо, ми хочемо хеш-чисел у діапазоні від 0 до 999,999,999 до числа від 0 до 99. Однією простою хеш-функцією може бути .h(x)=xmod100

Загальні додаткові властивості:

Залежно від випадку використання, ми можемо бажати, щоб хеш-функція задовольняла додаткові властивості. Ось кілька загальних додаткових властивостей:

  1. Уніфікованість : часто ми хочемо, щоб хеші об’єктів були чіткими. Більше того, ми можемо хотіти, щоб хеші були "розповсюдженнями". Якщо я хочу зафіксувати деякі об'єкти в 100 відрах (тому вихід моєї хеш-функції - це число від 0-99), я, як правило, сподіваюся, що близько 1/100 об'єктів приземляються у відрі 0, приблизно 1/100 землі в відро 1 тощо.

  2. Криптографічний опір зіткнення : Іноді це сприймається ще далі, наприклад, у криптографії я можу захотіти хеш-функцію, щоб обчислюваче важко було знайти два різних входи, які відображають один і той же результат.

  3. Стиснення : Я часто хочу розміщувати довільно великі входи до виходу постійного розміру або фіксованої кількості відра.

  4. Детермінізм : я можу захотіти хеш-функцію, вихід якої не змінюється між прогонами, тобто вихід хеш-функції на одному об'єкті завжди буде однаковим. Це може здатися суперечним однаковості вище, але одне рішення полягає в тому, щоб вибрати хеш-функцію випадковим чином один раз, а не змінювати її між прогонами.


Деякі програми

Одне поширене застосування - в структурах даних, таких як хеш-таблиця, які є способом реалізації словників. Тут ви виділяєте трохи пам’яті, скажімо, 100 «відер»; потім, коли вас попросять зберегти у словнику пару (ключ, значення), ви хешуєте ключ на номер 0-99 і зберігаєте пару у відповідному відрі в пам'яті. Потім, коли вас попросять шукати ключ, ви хеш-ключ на номер 0-99 з тією ж хеш-функцією і перевірте це відро, щоб побачити, чи є цей ключ там. Якщо так, ви повертаєте його значення.

Зауважте, що ви також можете реалізовувати словники іншими способами, наприклад, з двійковим деревом пошуку (якщо ваші об'єкти порівнянні).

Ще одне практичне застосування - контрольні суми, які є способами перевірити, чи два файли однакові (наприклад, файл не був пошкоджений у попередній версії). Оскільки хеш-функції малоймовірні для відображення двох входів на один і той же вихід, ви обчислюєте та зберігаєте хеш першого файлу, як правило, представлений у вигляді рядка. Цей хеш дуже маленький, може бути лише кілька десятків символів ASCII. Потім, коли ви отримуєте другий файл, ви хешуєте це і перевіряєте, чи є вихід таким же. Якщо так, майже напевно це точно той самий файл байт-за-баєм.

Інша програма є в криптографії, де ці хеші повинні бути важко "інвертованими" - тобто, враховуючи вихід і хеш-функцію, обчислювально слід визначити вхід (и), які призвели до цього виводу. Одне використання цього стосується паролів: Замість того, щоб зберігати сам пароль, ви зберігаєте криптографічний хеш пароля (можливо, з деякими іншими інгредієнтами). Потім, коли користувач вводить пароль, ви обчислюєте його хеш і перевіряєте, чи відповідає він правильному хешу; якщо так, ви кажете, що пароль правильний. (Зараз навіть у когось, хто може шукати і дізнатися хеш, збережений на сервері, немає такого простого часу, прикидаючись користувачем.) Цей додаток може бути випадком, коли вихід такий же довший або довший, ніж вхідний, оскільки вхід такий короткий.


1
Приємне пояснення, але я не згоден з "дуже малоймовірним". Див: programmers.stackexchange.com/questions/49550 / ... : зіткнення зробити відбуваються, а іноді і на подив часто.
Олів'є Дулак

8
Також зауважте, що в контексті цитографії термін "хеш" дуже сильно означає "односторонню" операцію, яку неможливо легко повернути на практиці. Коли його можна легко повернути назад, це називається "шифрування". Ось чому люди на Security.SE скажуть вам, що завжди хешуйте паролі своїх клієнтів, ніколи не шифруйте їх.
Іхрек

4
Хеш, який не "розповсюджується", все ще є хешем, можливо, не дуже вдалий для вашої програми.
Зупиніть шкодити Моніці

1
Звичайно, це все хороші моменти.
usul

10

Хеш - функція є функцією , яка приймає вхідний сигнал і видає значення фіксованого розміру. Наприклад, у вас може бути хеш-функція, stringHashяка приймає astring будь-яку довжину і виробляє 32-бітове ціле число.

Як правило, правильно сказати, що вихід хеш-функції - хеш (також відомий як хеш-значення або хеш-сума). Однак іноді люди називають саму функцію хешем . Це технічно некоректно, але зазвичай не помічається, оскільки зазвичай розуміється (в контексті), що людина мав на увазі хеш-функцію .

Типовим використанням хеш-функції є реалізація хеш-таблиці . Хеш-таблиця - це структура даних, яка пов'язує значення з іншими значеннями, які зазвичай називають ключами. Це робиться за допомогою хеш-функції на ключі для створення хеш-фіксованого розміру фіксованого розміру, який він може використовувати для швидкого пошуку даних, що зберігаються. Я не буду детально описувати, як це робити, але ключовим фактом тут є те, що його називають хеш-таблицею, оскільки він покладається на хеш-функцію для створення хеш-значень (хешів).

Ось тут і виникає деяка плутанина, оскільки деякі люди (знову ж таки, дещо неправильно) називають хеш-таблицю хешем. Як зазначено в інших відповідях, іноді реалізація хеш-таблиці даної мови позначає хеш-таблицю як хеш (зокрема, це робить Perl, хоча, мабуть, і інші мови). Інші мови вирішують посилатися на їх реалізацію хеш-таблиці як на словник. Python є однією з цих мов, але через те, наскільки вони вбудовані в мову, багато користувачів Python скорочують термін словник до "диктувати".

Тоді як правильне використання терміна хеш позначає хеш-значення, що створюється хеш-функцією , люди також іноді використовують термін неофіційно для позначення хеш-функцій та хеш-таблиць , отже створюючи плутанину.


2
Я не впевнений, що насправді неправильно називати хеш-таблицю або хеш-функцію як "хеш" (це не здається гіршим, ніж, наприклад, "Вашингтон" означає "Сполучені Штати", як у " Вашингтон обережно вітав заяву Китаю "). Але я погоджуюся, що це заплутано, і це добре, що ви дуже зрозуміли про це у своїй відповіді.
Девід Річербі

1
@DavidRicherby Формально я б сказав, що робота "хеш" не визначена. "Хеш-функція", "хеш-значення", "хеш-таблиця" та "хеш-рядок" усі мають точні математичні визначення, але "хеш" неоднозначний. Так само я знаю, що ви маєте на увазі під «Вашингтоном», але ваше речення все ж має сенс, якщо я тлумачу «Вашингтон» означати «Джордж Вашингтон» або «Дензел Вашингтон», а не «Місто Вашингтон», що є дуже неформальним способом для посилання на федеральний уряд. Підсумок: будьте обережні, щоб не переплутати "знаючи, що ви маєте на увазі", для чіткого формального визначення.
Майк Оунсворт

@DavidRicherby Це насправді не еквівалентна аналогія. Неправильність є дискусійною, але неформальність - ні.
Фарап

2

Хеш-функція - це будь-яка функція, де зображення менше домену . Вихід такої функції f(x)можна назвати "хеш x".

У інформатиці ми зазвичай стикаємось із двома додатками хеш-функцій.

Перший - для структур даних, таких як хеш-таблиці , де ми хочемо зіставити ключовий домен (наприклад, 32-бітні цілі числа або рядки довільної довжини) в індекс масиву (наприклад, ціле число від 0 до 100). Мета тут - максимізувати ефективність структури даних; властивостями хеш-функції, які зазвичай бажані, є простота та рівномірний розподіл виводу.

Perl називає свій вбудований асоціативний масив типу "хеш" , який, здається, є причиною вашої плутанини тут. Я не знаю жодної іншої мови, яка це робить. Помірно структура даних може розглядатися як хеш-функція сама (де домен - поточний набір ключів), але також реалізована як хеш-таблиця.

Друга - для криптографії : автентифікація повідомлення, перевірка паролем / підписом тощо. Домен, як правило, є довільними рядками байтів. Тут ми піклуємося про безпеку - що іноді означає навмисне низьку продуктивність - де корисними властивостями є зіткнення та опір попереднього зображення.


І я все ще заперечую проти вашого першого речення, оскільки при хешировании 32-символьних паролів із SHA-512, вхідний простір насправді менший, ніж вихідний простір. При поєднанні хеш-функцій разом, домен і діапазон однакові; розмір вхідного простору не має значення. Відповідь Фарапа має правильне визначення: "Хеш-функція - це будь-яка функція з виходом фіксованої довжини". Це все, це все, що вам потрібно, всі інші умови, про які ви говорите, випливають із цього.
Майк Оунсворт

@MikeOunsworth, але домен SHA-512 - це двійкові рядки довільної довжини. Я припускаю, що я міг би вкрасти формулювання Pharaps, але я намагався зробити умови явними на користь ОП. Я насправді не впевнений, що "фіксованої довжини" це потрібно, ані однозначно визначеного.
Зупиніть шкодити Моніці

@ OrangeDog Добре, але я можу загортати SHA-512 всередині функції, MikesHash()яка називається, яка приймає рядки довжиною 12 і передає їх SHA-512, і повертає вихід. Я майже впевнений, що MikesHash()все ще відповідає визначенню хеш-функції. (На практиці ви маєте рацію, хеш-функції, які ми використовуємо, приймають введення довільної довжини, але я не думаю, що щось не вдається бути хеш-функцією, якщо цього не відбувається.)
Майк Оунсворт,

@MikeOunsworth однаково я можу його обернути таким чином, щоб результат був усіченим або підбитим, якщо msb є єдиним. Вихід вже не фіксованої довжини, але чи все ж це хеш-функція?
Зупиніть шкодити Моніці

@OrangeDog Я б сказав, що ні. Моя думка все разом полягала в тому, що хеш-функція повинна відповідати виводу фіксованого розміру, але розмір вводу не має значення. У нас дуже далеко поза темою. У вашій відповіді є хороші речі, просто будьте обережні зі своїм формальним визначенням ;-)
Майк Оунсворт

0

Відмінне запитання Василь Айд,

Ось мій погляд на те, що таке хеш для чогось, над чим я працюю сьогодні.

*

Скористайтеся контрольною сумою, щоб переконатися, що тарбол відповідає контенту сторінки завантаження

*

введіть тут опис зображення Одягає шапку аудитора, я маю на увазі магію халата

хеш - це значення / string / what / label, переконайтесь, що воно на вашій машині те саме, що і джерело завантаження.


3
Це лише одне використання для хешу. Є багато інших цілей.
Yuval Filmus

Ласкаво просимо на сайт! Використання криптографічних хешів як контрольних сум вже охоплене прийнятою відповіддю, тому ваша відповідь не додає нічого нового, займаючи багато місця на екрані.
Девід Річербі

-1

Я спробую лише додати короткий підсумок того, що кажуть інші.

Функція хешу

Існує особливий вид функцій, який називається хеш-функціями.

"SHA256 - це добре відома хеш-функція, яка є криптографічно захищеною"

Три основні програми - * хеш-таблиці, * контрольні суми (перевірки цілісності даних, наприклад, на жорстких дисках або протоколах ADSL), * і криптографія (різні форми криптографічної автентифікації, включаючи цифрові підписи та безпечне зберігання паролів, але не обмежуючись ними).

Таблиця хешу

Таблиця хеш - структура даних для швидкого пошуку. Він використовує хеш-функції внутрішньо, звідси і назва.

"Бази даних використовують хеш-таблиці та внутрішні пошуки дерев для прискорення виконання запитів пошуку"

Хеш

  1. тип даних абстрактних словників

"Хеш" - офіційна назва вбудованих словників на Perl. Вони є хеш-таблицями всередині, звідси і назва. "Ця підпрограма приймає хеш як перший аргумент". Ці дні можна використовувати для будь-якого асоціативного масиву, не обов'язково хеш-таблиці.

  1. результат застосування хеш-функції до деякого входу

"MD5-хеші зображень .iso надаються для перевірки їх цілісності після завантаження".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.