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

115

Насколько я понимаю, хэш-код и контрольная сумма похожи друг на друга - числовое значение, вычисленное для блока данных, является относительно уникальным.

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

Итак, есть ли у нас два слова для обозначения одного и того же, или есть важные различия между хэш-кодами и контрольными суммами?

Ричард Ив
источник
3
Подводя итог приведенным ниже ответам: хэш-код сокращает ввод до небольшого числа таким образом, чтобы минимизировать вероятность столкновений. Контрольная сумма, с другой стороны, сокращает ввод до небольшого числа, сводя к минимуму вероятность коллизий. Вы можете сделать один звук отличным от другого, произвольно перефразируя это описание.
Дэн Штальке
3
@DanStahlke - Нет, ответы ниже не об этом. Да, они оба сокращают ввод до меньшего числа. Но есть много-много способов сделать это, как выбрать, какой алгоритм использовать? Это зависит от вашей цели. Подводя итог двум основным ответам: цель контрольной суммы - « обнаружить наиболее распространенные ошибки ». Выберите алгоритм, который дает другую контрольную сумму для любых ошибок, которые являются «наиболее распространенными» в вашем сценарии. Если вас беспокоит переключение одного или двух битов, вы можете выбрать алгоритм, который гарантирует обнаружение этой конкретной ошибки! Это очень специфический компромисс.
ToolmakerSteve
1
@DanStahlke - с другой стороны, хэш-код охватывает широкий спектр возможных компромиссов. Если мы имеем в виду значение, используемое при создании хеш-таблицы, мы знаем, что будет много коллизий. Это совсем другой компромисс (чем контрольная сумма). Мы стараемся в среднем снизить количество столкновений . Мы ничего не гарантируем. Могут быть некоторые входные данные, которые отличаются только одним битом, но дают один и тот же хэш. Это прекрасно, если в среднем мы получаем хороший разброс значений хеш-функции. Все же было бы неприемлемо для контрольной суммы.
ToolmakerSteve

Ответы:

72

Я хотел бы сказать , что контрольная сумма обязательно хэш - код . Однако не все хэш-коды дают хорошие контрольные суммы.

Контрольная сумма имеет особое назначение - она ​​проверяет или проверяет целостность данных (некоторые могут выходить за рамки этого, допуская исправление ошибок ). «Хорошие» контрольные суммы легко вычислить, и они могут обнаруживать многие типы повреждений данных (например, один, два, три ошибочных бита).

Хэш-код просто описывает математическую функцию, которая сопоставляет данные с некоторым значением. При использовании в качестве средства индексации в структурах данных (например, в хэш-таблице) желательна низкая вероятность столкновения.

Зак Скривена
источник
6
Возможно, одно можно было бы использовать в качестве другого, но, учитывая, что у них разные цели дизайна, это просто сбивает с толку.
Вим Коенен,
8
@gumbo: нет, не каждый хэш-код является контрольной суммой. См. Пример строки из MSalters ниже.
MarcH
41

У каждого из них своя цель:

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

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

Рафал Довгирд
источник
1
Также хорошо отметить, что некриптографическая версия хэш-кодов может обеспечить хороший компромисс между временем вычисления (близким к CRC) и обнаружением ошибок, будь то преднамеренная или просто ошибка связи / битовая гниль (нельзя ожидать, что CRC обнаружит преднамеренное вмешательство, потому что относительно легко намеренно спроектировать столкновение).
gaborous 04
1
Для меня ключевая фраза в вашем ответе заключается в том, что контрольная сумма предназначена для обнаружения наиболее распространенных ошибок . Да это оно. это алгоритм хеширования, который был выбран для получения разных значений вероятных искажений данных. Это конкретная цель, которая приводит к определенным алгоритмам, которые оптимизируются для этого - в зависимости от типов возмущений, которые вас беспокоят.
ToolmakerSteve
22

Различия действительно есть:

  • Контрольные суммы просто должны быть разными, если входные данные разные (как можно чаще), но почти так же важно, чтобы они были быстрыми для вычисления.
  • Хэш-коды (для использования в хэш-таблицах) предъявляют те же требования, и, кроме того, они должны быть равномерно распределены по пространству кода, особенно для аналогичных входных данных.
  • К криптографическим хешам предъявляются гораздо более строгие требования: с учетом хеша вы не можете создать вход, который производит этот хеш. Время вычисления занимает второе место, и в зависимости от приложения может быть даже желательно, чтобы хэш был очень медленным для вычисления (для борьбы с атаками грубой силы).
Майкл Боргвардт
источник
1
Я не думаю, что различие контрольных сумм для разных входов имеет какие-либо преимущества. Они нужны только для проверки целостности, а не для хеширования.
user541686
1
@Mehrdad: так как вы предлагаете проверку целостности, не получая разных результатов для разных входов?
Michael Borgwardt
Э, может я неправильно сформулировал то, что сказал? Я имел в виду ту часть, где вы сказали «насколько это возможно» - я просто говорю, что нет причин для их непредсказуемости или «далекости», как хэши. Пока происходит некоторое изменение контрольной суммы, когда ввод претерпевает типичное изменение, это точная контрольная сумма. Сравните это с хешами, которые также имеют цель распределить вещи как можно более равномерно / случайно / непредсказуемо / «далеко» в своем кодомене.
user541686 06
Я думаю, вы просто неверно истолковали то, что я имел в виду под «насколько возможно» - я просто имел в виду, что столкновения должны быть как можно более редкими, хотя, конечно, они неизбежны. Я поменяю формулировку.
Майкл Боргвардт
@Mehrdad - сначала это не имело для меня смысла. Если контрольная сумма не имеет хорошего распределения по возможным значениям контрольной суммы, это означает, что есть некоторые значения контрольной суммы, которые возвращаются для гораздо большего количества входных значений (чем для других контрольных сумм). Но это снижает полезность контрольной суммы? [Это увеличивает шансы того, что искаженные данные вернут тот же результат, верно?] Хм, я ошибаюсь, вы правы: контрольная сумма должна только хорошо определять вероятные нарушения. Это может не потребовать равномерного распределения по всем значениям.
ToolmakerSteve
10

И хэш-коды, и контрольные суммы используются для создания короткого числового значения из элемента данных. Разница в том, что значение контрольной суммы должно измениться, даже если в элемент данных было внесено небольшое изменение. Для хеш-значения требуется просто, чтобы у реальных элементов данных были разные хеш-значения.

Яркий пример - струны. Контрольная сумма для строки должна включать каждый бит, и порядок имеет значение. С другой стороны, хэш-код часто может быть реализован как контрольная сумма префикса ограниченной длины. Это означало бы, что «aaaaaaaaaaba» будет хешировать так же, как «aaaaaaaaaaab», но алгоритмы хеширования могут справляться с такими коллизиями.

MSalters
источник
Этот ответ - тот, который мне звонит. Таким образом, целостность данных не является предметом хеширования.
truthadjustr,
9

Википедия хорошо об этом говорит:

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

Джон Скит
источник
28
Прочитав это, мне все еще интересно, в чем разница.
kirk.burleson
@ kirk.burleson - Я бы сказал, что принцип один и тот же , но на практике всегда идут на компромиссы . В разных ситуациях применяются разные компромиссы, поэтому используются разные подходы. На самом деле это не оправдание того, что существуют два разных слова, просто говоря, что если вы ищете хорошие методы для контрольных сумм, вы можете найти другой набор алгоритмов, чем при поиске хэш-кодов.
ToolmakerSteve
5

Контрольная сумма защищает от случайных изменений.

Криптографический хеш защищает от очень мотивированного злоумышленника.

Когда вы отправляете биты по сети, может случайно случиться так, что некоторые биты будут либо перевернуты, либо удалены, либо вставлены. Чтобы получатель мог обнаруживать (или иногда исправлять) подобные происшествия, отправитель использует контрольную сумму.

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

user3464863
источник
3
«Криптографический хеш» увеличивает путаницу между «хешем» и «контрольной суммой». «криптографическая контрольная сумма» лучше, потому что это не так.
MarcH
5

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

Источник: CompTIA ® Security + Руководство по основам сетевой безопасности - Пятое издание - Марк Чампа - стр. 191

N Randhawa
источник
4

В наши дни они взаимозаменяемы, но в былые времена контрольная сумма была очень простой техникой, когда вы добавляли все данные (обычно в байтах) и добавляли байт в конце с этим значением в ... тогда вы, надеюсь, узнать, не были ли повреждены какие-либо исходные данные. Подобно контрольному биту, но с байтами.

Стивен Роббинс
источник
4

Разница между функциями хэш-кода и контрольной суммы в том, что они предназначены для разных целей.

  • Контрольная сумма используется, чтобы узнать, изменилось ли что-то во входных данных.

  • Хэш-код используется, чтобы узнать, изменилось ли что-то во входных данных, и чтобы иметь как можно большее «расстояние» между отдельными значениями хэш-кода.

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

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


О вероятности:

Например, предположим, что входные данные на самом деле всегда меняются (в 100% случаев). Предположим, у вас есть «идеальная» функция хеширования / контрольной суммы, которая генерирует 1-битное значение хеш-функции / контрольной суммы. Следовательно, вы будете получать разные значения хэша / контрольной суммы в 50% случаев для случайных входных данных.

  • Если изменился ровно 1 бит в ваших случайных входных данных, вы сможете обнаружить это в 100% случаев, независимо от того, насколько велики входные данные.

  • Если 2 бита в ваших случайных входных данных изменились, ваша вероятность обнаружения «изменения» делится на 2, потому что оба изменения могут нейтрализовать друг друга, и никакая функция хеширования / контрольной суммы не обнаружит, что 2 бита во входных данных фактически различаются. ,

    ...

Это означает, что если количество бит в ваших входных данных в несколько раз больше, чем количество бит в вашем значении хэша / контрольной суммы, ваша вероятность фактического получения разных значений хеша / контрольной суммы для разных входных значений уменьшается и не является постоянный .

Саша Ведлер
источник
2

Я обычно использую слово «контрольная сумма» при обращении к коду (числовому или другому), созданному для файла или фрагмента данных, который можно использовать для проверки того, что файл или данные не были повреждены. Чаще всего я использую для проверки того, что файлы, передаваемые по сети, не были изменены (намеренно или иным образом).

Ian1971
источник
1
Поскольку контрольные суммы не так сложно отменить, это говорит о том, что они не годятся для проверки того, было ли что-то изменено намеренно.
Benblasdell
0

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

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

6Приходит дважды через различные входы. Цель хэша - просто сопоставить входное значение с выходным значением, а уникальность не является частью сделки. Так что два разных входа, которые производят один и тот же результат, прекрасны в мире хешей.

Контрольная сумма, с другой стороны, должна отличаться от выходных данных, даже если один бит во входных данных изменяется, потому что их цель - не отображение, а обнаружение повреждения данных. Таким образом, два разных входа, которые дают один и тот же результат, недопустимы в контрольной сумме.

truthadjustr
источник
-4

Контрольная сумма - это просто число, сгенерированное из поля данных с помощью oring (путем логического сложения, следовательно, суммы). Контрольная сумма может обнаруживать повреждение любого бита или количества битов в поле данных, из которого она сгенерирована, т.е. она проверяет наличие ошибок, вот и все, она не может их исправить. Контрольная сумма - это хэш, потому что размер контрольной суммы меньше исходных данных. Да, у вас будут коллизии, потому что контрольная сумма совершенно не зависит от положения бита в поле данных.

Циклический контроль избыточности (CRC) - это нечто совершенно иное, более сложное и НЕ называется контрольной суммой. Это приложение полиномиального ряда, которое может исправлять любое выбранное количество отдельных поврежденных битов в поле данных, из которого он был сгенерирован. Создание CRC приводит к числу, большему по размеру, чем исходное поле данных (в отличие от контрольной суммы) - отсюда и название, включающее слово «избыточность» и цену, которую вы платите за возможность исправления ошибок. Таким образом, CRC НЕ является хешем, и его нельзя путать или называть контрольной суммой, потому что избыточность обязательно увеличивает размер исходных данных.

CapitainSensible
источник