Когда хеши сталкиваются?

Я понимаю, что согласно принципу ящика, если количество объектов будет больше, чем количество контейнеров, то по крайней мере один контейнер будет иметь больше чем один объект. Это имеет значение, каким контейнером это будет? Как это относится к MD5, SHA1, хешам SHA2?

9
задан user963241 28 February 2010 в 04:30
поделиться

5 ответов

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

Таким образом, хэш должен быть достаточно большим, чтобы квадратный корень из области поиска был слишком большим для перебора. Квадратный корень пространства поиска для SHA1 равен 2 80 , и по состоянию на март 2012 года не было найдено двух значений с одним и тем же хешем SHA1 (хотя я предполагаю, что это произойдет в пределах в следующем году-двух ..); то же самое и с SHA2, семейством хэшей, у которых есть еще большее пространство поиска. Хотя MD5 некоторое время не работает .

15
ответ дан 4 December 2019 в 10:03
поделиться

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

Коллизия происходит относительно легко даже с «приличным» алгоритмом хеширования. Например, в Java

String s = new String(new char[size]);

всегда хешируется до 0. То есть все строки, содержащие только \ 0 хеш-значение в Java.


Что касается «имеет ли значение, какой это будет контейнер?», Опять же, это зависит от приложения. Вы можете создавать хэш-функции, которые будут хешировать «похожие» объекты на близлежащие значения. Это полезно, например, когда вы хотите найти похожие объекты. Просто перемешайте их все и посмотрите, куда они упадут. В этом случае желательны столкновения или близкие к столкновениям объекты, поскольку они группируют похожие объекты.

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

0
ответ дан 4 December 2019 в 10:03
поделиться

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

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

Вы увидите, что люди называют MD5 «сломанным» алгоритмом хеширования, хотя на самом деле он просто плохой для использования в качестве криптографического хеша. Он будет лучше, чем тот, который вы построите сами.

4
ответ дан 4 December 2019 в 10:03
поделиться

В зависимости от вашего приложения криптографические хэши, такие как MDA, SHA1 / 2 и т. Д., Могут быть не идеальным выбором именно потому, что они выглядят как полностью случайные, поэтому давая вам столкновения, как предсказано парадоксом дня рождения. Традиционно одной из причин использования простых хэшей, основанных на операции остатка, является то, что ключи должны были быть серийными номерами или аналогичными, так что операция остатка будет выдерживать меньше коллизий, чем ожидалось случайным образом. Например. если ключи представляют собой целые числа от 1 до 1000, у вас может вообще не быть коллизий в контейнере размером 1009, если ваша хеш-функция - это ключевой мод 1009. Люди иногда вручную настраивали системы, тщательно выбирая размер контейнера и хеш-функцию, чтобы добиться равного раскола.

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

0
ответ дан 4 December 2019 в 10:03
поделиться

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

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

Как упоминал Майкл, столкновения происходят ДОЛГО, прежде чем будет столько же предметов, сколько слотов. У вас должна быть изящная обработка конфликтов (или идеальный хеш), если вы хотите справиться с парадоксом дня рождения .

2
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: