Хеш-код и контрольная сумма - какая разница? - PullRequest
97 голосов
/ 20 января 2009

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

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

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

Ответы [ 10 ]

61 голосов
/ 20 января 2009

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

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

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

39 голосов
/ 20 января 2009

За каждым из них стоит своя цель:

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

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

20 голосов
/ 20 января 2009

Есть действительно некоторые различия:

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

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

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

8 голосов
/ 20 января 2009

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

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

3 голосов
/ 20 ноября 2014

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

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

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

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

3 голосов
/ 20 января 2009

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

2 голосов
/ 27 февраля 2014

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

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

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

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

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


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

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

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

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

    ...

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

1 голос
/ 13 марта 2018

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

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

1 голос
/ 20 января 2009

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

...