Хэш-код и контрольная сумма - какая разница?
Насколько я понимаю, хеш-код и контрольная сумма являются похожими вещами - числовое значение, вычисленное для блока данных, которое является относительно уникальным.
Т.е. вероятность того, что два блока данных дадут одно и то же числовое значение хэш / контрольной суммы, достаточно мала, чтобы ее можно было игнорировать для целей приложения.
Итак, у нас есть два слова для одной и той же вещи, или есть важные различия между хэш-кодами и контрольными суммами?
10 ответов
Я бы сказал, что контрольная сумма - это обязательно хеш-код. Однако не все хеш-коды дают хорошие контрольные суммы.
Контрольная сумма имеет специальное назначение - она проверяет или проверяет целостность данных (некоторые могут пойти дальше, допуская исправление ошибок). "Хорошие" контрольные суммы легко вычисляются и могут обнаруживать многие типы повреждений данных (например, один, два, три ошибочных бита).
Хеш-код просто описывает математическую функцию, которая отображает данные на некоторое значение. При использовании в качестве средства индексации в структурах данных (например, в хэш-таблице) желательна низкая вероятность столкновения.
За каждым из них стоит своя цель:
- Хеш-код - разработан так, чтобы быть случайным по всему домену (чтобы минимизировать коллизии в хеш-таблицах и тому подобное). Криптографические хэш-коды также предназначены для вычислительной невозможности обратного преобразования.
- Контрольная сумма - предназначена для выявления наиболее распространенных ошибок в данных и часто для быстрого вычисления (для эффективного контрольного суммирования быстрых потоков данных).
На практике одни и те же функции часто хороши для обеих целей. В частности, криптографически сильный хеш-код является хорошей контрольной суммой (почти невозможно, чтобы случайная ошибка сломала сильную хэш-функцию), если вы можете позволить себе вычислительные затраты.
Есть действительно некоторые различия:
- Контрольные суммы просто должны быть разными, когда ввод отличается (как можно чаще), но почти так же важно, чтобы они быстро вычислялись.
- К хеш-кодам (для использования в хеш-таблицах) предъявляются те же требования, и, кроме того, они должны быть равномерно распределены по пространству кода, особенно для входных данных, которые похожи.
- Криптографические хеши имеют гораздо более строгое требование, чем хеш, вы не можете создать вход, который создает этот хеш. Время вычислений идет вторым, и, в зависимости от приложения, может быть даже желательно, чтобы хэш был очень медленным для вычисления (для борьбы с атаками методом "грубой силы").
Хеш-коды и контрольные суммы используются для создания коротких числовых значений из элемента данных. Разница в том, что значение контрольной суммы должно измениться, даже если в элемент данных внесены небольшие изменения. Для хэш-значения требуется, чтобы элементы данных реального мира имели разные хэш-значения.
Ярким примером являются строки. Контрольная сумма для строки должна включать каждый бит, и порядок имеет значение. С другой стороны, хеш-код часто может быть реализован как контрольная сумма префикса ограниченной длины. Это будет означать, что "aaaaaaaaaaba" будет хэшировать так же, как "aaaaaaaaaaab", но алгоритмы хеширования могут иметь дело с такими коллизиями.
Википедия хорошо это формулирует:
Функции контрольной суммы относятся к хеш-функциям, отпечаткам пальцев, функциям рандомизации и криптографическим хеш-функциям. Однако каждая из этих концепций имеет разные приложения и, следовательно, разные цели проектирования. Контрольные цифры и биты четности являются особыми случаями контрольных сумм, подходящих для небольших блоков данных (таких как номера социального страхования, номера банковских счетов, компьютерные слова, отдельные байты и т. Д.). Некоторые коды с исправлением ошибок основаны на специальных контрольных суммах, которые не только обнаруживают типичные ошибки, но и позволяют восстанавливать исходные данные в определенных случаях.
Хотя хэширование и контрольные суммы похожи в том, что они оба создают значение на основе содержимого файла, хэширование не то же самое, что создание контрольной суммы. Контрольная сумма предназначена для проверки (проверки) целостности данных и выявления ошибок при передаче данных, а хеш - для создания уникального цифрового отпечатка данных.
Источник: CompTIA ® Security+ Руководство по основам сетевой безопасности - Пятое издание - Марк Чампа -Страница 191
Контрольная сумма защищает от случайных изменений.
Криптографический хэш защищает от очень мотивированного злоумышленника.
Когда вы отправляете биты по проводам, может случиться, что некоторые биты либо перевернуты, либо удалены, либо вставлены. Чтобы позволить получателю обнаружить (или иногда исправить) несчастные случаи, подобные этой, отправитель использует контрольную сумму.
Но если вы предполагаете, что кто-то активно и разумно изменяет сообщение в сети, и вы хотите защитить его от атак злоумышленников, используйте криптографический хеш (я игнорирую криптографическую подпись хеша или использование вторичного канала или чего-то подобного, поскольку вопрос вроде не ускользает от этого).
Разница между функциями хэш-кода и контрольной суммы заключается в том, что они предназначены для разных целей.
Контрольная сумма используется, чтобы узнать, изменилось ли что-то на входе.
Хеш-код используется для того, чтобы узнать, изменилось ли что-то во входных данных, и иметь как можно большее "расстояние" между отдельными значениями хеш-кода.
Кроме того, могут существовать дополнительные требования к хеш-функции, в отличие от этого правила, например, возможность формировать деревья / кластеры / группы значений хеш-кода на ранних этапах.
И если вы добавите некоторую общую начальную рандомизацию, вы получите концепцию современного шифрования / обмена ключами.
О вероятности:
Например, давайте предположим, что входные данные на самом деле всегда изменяются (100% времени). И давайте предположим, что у вас есть "идеальная" функция хеш / контрольной суммы, которая генерирует 1-битное значение хеш / контрольной суммы. Следовательно, вы получите разные значения хэш / контрольной суммы в 50% случаев для случайных входных данных.
Если ровно 1 бит в ваших случайных входных данных изменился, вы сможете обнаружить это 100% времени, независимо от того, насколько велики входные данные.
Если 2 бита в ваших случайных входных данных изменились, ваша вероятность обнаружения "изменения" делится на 2, потому что оба изменения могут нейтрализовать друг друга, и никакая функция хеша / контрольной суммы не обнаружит, что 2 бита фактически различаются во входных данных,
...
Это означает, что если количество бит во ваших входных данных во много раз превышает количество бит в вашем значении хеш / контрольной суммы, ваша вероятность фактического получения разных значений хеша / контрольной суммы для разных входных значений уменьшается и не постоянный
В наши дни они взаимозаменяемы, но в прежние времена контрольная сумма была очень простой техникой, когда вы добавляли все данные (обычно в байтах) и вставляли в конец байт с этим значением в... тогда вы надеялись знать, если какие-либо из исходных данных были повреждены. Похоже на контрольный бит, но с байтами.
Я склонен использовать контрольную сумму слова при обращении к коду (числовому или иному), созданному для файла или части данных, которые можно использовать для проверки того, что файл или данные не были повреждены. Самое распространенное использование, с которым я сталкиваюсь, - это проверка того, что файлы, отправленные по сети, не были изменены (умышленно или нет).
В сегментировании данных кластера Redis он использует hash slot
чтобы решить, к какому узлу он идет. Возьмем, к примеру, операцию по модулю ниже:
123 % 9 = 6
122 % 9 = 5
141 % 9 = 6
В 6
появляется дважды на разных входах. Цель хэша - просто сопоставить входное значение с выходным значением, а уникальность не является частью сделки. Так что два разных входа, которые производят один и тот же результат, прекрасны в мире хешей.
Контрольная сумма, с другой стороны, должна отличаться от вывода, даже если один бит на входе изменяется, потому что его цель - не отображение, а обнаружение повреждения данных. Таким образом, два разных входа, которые производят один и тот же результат, недопустимы в контрольной сумме.
hash code
(Sip Hash) обычно используется для хеш-таблиц, где время доступа около O(1)check sum
(MD5, SHA) используется для обозначения целостности данных
Главное отличие в том, что
check sum
я должен быть уникальным, пока
hash code
может быть одинаковым для разных объектов
Контрольная сумма - это просто число, сгенерированное из поля данных с помощью oring(путем логического сложения, следовательно, суммы). Контрольная сумма может обнаруживать повреждение любого бита или количества битов в поле данных, из которого она сгенерирована, то есть она проверяет наличие ошибок, вот и все, она не может их исправить. Контрольная сумма - это хэш, потому что размер контрольной суммы меньше исходных данных. Да, у вас будут коллизии, потому что контрольная сумма совершенно не зависит от положения бита в поле данных.
Циклический контроль избыточности ( CRC) - это нечто совершенно иное, более сложное и НЕ называется контрольной суммой. Это приложение полиномиального ряда, которое может исправлять любое выбранное количество отдельных поврежденных битов в поле данных, из которого он был сгенерирован. Создание CRC приводит к количеству большего размера, чем исходное поле данных (в отличие от контрольной суммы) - отсюда и название, включающее слово "избыточность" и цену, которую вы платите за возможность исправления ошибок. Таким образом, CRC НЕ является хешем, и его не следует путать или называть контрольной суммой, поскольку избыточность обязательно увеличивает размер исходных данных.