Хеш-код і контрольна сума - в чому різниця?


115

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

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

Тож у нас є два слова для однієї речі, чи є важливі відмінності між хеш-кодами та контрольними сумами?


3
Щоб узагальнити відповіді нижче: Хеш-код зменшує введення на невелику кількість таким чином, що мінімізує ймовірність зіткнень. З іншого боку, контрольна сума зменшує вхід до невеликої кількості таким чином, що мінімізує ймовірність зіткнень. Ви можете зробити один звук відмінним від іншого, довільно перефразовуючи цей опис.
Dan Stahlke

3
@DanStahlke - Ні, це не те, про що говорять нижче. Так, вони обоє зменшують вхід на меншу кількість. Але існує багато-багато способів зробити це, як вибрати, який алгоритм використовувати? Це залежить від вашої мети. Підводячи підсумки двох найкращих відповідей: мета контрольної суми - « виявити найпоширеніші помилки ». Виберіть алгоритм, який дає різну контрольну суму, для будь-яких помилок, "найчастіших" у вашому сценарії. Якщо ви турбуєтесь про те, що один або два біти перемикаються, ви можете вибрати алгоритм, який гарантує виявлення цієї конкретної помилки! Це дуже специфічний компроміс.
ToolmakerSteve

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

Відповіді:


72

Я хотів би сказати , що контрольна сума обов'язково хеш - код . Однак не всі хеш-коди роблять хороші контрольні суми.

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

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


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

8
@gumbo: ні, не кожен хеш-код - контрольна сума. Дивіться рядковий приклад з MSalters нижче.
MarcH

41

За кожним із них стоїть різна мета:

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

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


1
Також добре згадати, що некриптографічна версія хеш-кодів може забезпечити хороший компроміс між часом обчислення (близьким до CRC) та виявленням помилок, будь то навмисне чи просто помилка зв’язку / гниття бітів (CRC не можна очікувати, щоб виявити навмисне підроблення, оскільки відносно легко навмисно спроектувати зіткнення).
габоровий

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

22

Дійсно є деякі відмінності:

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

1
Я не думаю, що контрольні суми різними для різних входів не мають жодних переваг. Вони просто для перевірки цілісності, а не для хешування.
користувач541686

1
@Mehrdad: то як запропонувати перевірити цілісність, не отримуючи різних результатів для різних входів?
Майкл Боргвардт

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

Я думаю, ви просто неправильно трактували те, що я мав на увазі під «якомога далі», - я просто мав на увазі, що зіткнення повинні бути як можна рідшими, хоча вони, звичайно, неминучі. Я зміню формулювання.
Майкл Боргвардт

@Mehrdad - спочатку це не мало для мене сенсу. Якщо контрольна сума не має хорошого розподілу за можливими значеннями контрольної суми, це означає, що деякі контрольні суми повертаються на набагато більше вхідних значень (ніж для інших контрольних сум). Але це зменшує корисність контрольної суми? [Це збільшує шанси на те, що збурені дані повернуть той самий результат, правда?] Хм, я помиляюся, ти маєш рацію: контрольна сума повинна бути хорошою для виявлення ймовірних збурень. Це може не вимагати рівномірного розподілу всіх значень.
ToolmakerSteve

10

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

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


Ця відповідь - це те, що дзвонить у мене дзвоном. Отже цілісність даних не є фокусом хешу.
truthadjustr

9

У Вікіпедії це добре:

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


28
Прочитавши це, мені все ще цікаво, в чому різниця.
kirk.burleson

@ kirk.burleson - я б сказав, що вони є тим самим принципом , але на практиці завжди робиться компроміси . У різних ситуаціях застосовуються різні компроміси, тому застосовуються різні підходи. Насправді не виправдання існування двох різних слів, просто кажучи про те, що якщо шукати хороші методи контрольних сум, ви можете знайти інший набір алгоритмів, ніж при пошуку хеш-кодів.
ToolmakerSteve

5

Контрольна сума захищає від випадкових змін.

Криптографічний хеш захищає від дуже мотивованого нападника.

Коли ви надсилаєте біти на дріт, може випадково трапитися, що деякі біти або перевернуті, або видалені, або вставлені. Щоб одержувач міг виявити (або іноді виправити) такі нещасні випадки, відправник використовує контрольну суму.

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


3
"криптографічний хеш" збільшує плутанину між "хеш" і "контрольною сумою". "криптографічна контрольна сума" краща, оскільки її немає.
MarcH

5

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

Джерело: CompTIA ® Безпека + Посібник з Основ мережевої безпеки - П'яте видання - Марк Ciampa - Сторінка 191


4

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


4

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

  • Контрольна сума використовується для з'ясування того, чи щось змінилось у вхідних даних.

  • Хеш-код використовується для того, щоб дізнатися, чи змінилося щось у введенні та щоб провести якомога більше "відстань" між окремими значеннями хеш-коду.

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

    А якщо додати деяку спільну початкову рандомізацію, ви переходите до концепції сучасного шифрування / обміну ключами.


Про ймовірність:

Наприклад, припустимо, що вхідні дані насправді завжди змінюються (100% часу). І давайте припустимо, що у вас є "ідеальна" хеш-контрольна сума, яка генерує 1-бітове значення хеш-контрольної суми. Таким чином, ви отримаєте різні значення хеш-контрольної суми, 50% часу, для випадкових вхідних даних.

  • Якщо рівно 1 біт у ваших випадкових вхідних даних змінився, ви зможете виявити, що 100% часу, незалежно від того, наскільки великі вхідні дані.

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

    ...

Це означає, що якщо кількість бітів у ваших вхідних даних у багато разів перевищує кількість бітів у вашому значенні хеш / контрольної суми, ваша ймовірність фактично отримати різні значення хеш / контрольної суми для різних вхідних значень зменшується і не є постійний .


2

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


1
Оскільки контрольні суми не важко повернути назад, це говорить про те, що вони не були б корисними для перевірки, чи було щось навмисно змінено.
benblasdell

0

У обробці даних кластера Redis він використовує a, hash slotщоб вирішити, до якого вузла йде. Візьмемо для прикладу модульну операцію нижче:

123 % 9 = 6
122 % 9 = 5
141 % 9 = 6

6Приходить двічі через різні входи. Метою хешу є просто відображення вхідного значення на вихідне значення, і унікальність не є частиною угоди. Тож два різних входи, які дають однаковий вихід, є чудовими у світі хешей.

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


-4

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

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

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