Сколько можно обрезать хеш SHA1 и быть уверенным в наличии уникального идентификатора? - PullRequest
17 голосов
/ 24 января 2011

Я делаю приложение, которое хранит документы и присваивает каждому UID на основе дайджеста SHA1 нескольких вещей, включая метку времени.Дайджест содержит много символов, и я хочу, чтобы пользователи могли идентифицировать документы, используя первые x символов полного дайджеста.Что будет хорошим значением для x, если число документов может быть около 10K - 100K?

Ответы [ 5 ]

20 голосов
/ 24 января 2011

Адаптируя формулы в википедии для задачи «День рождения» , вы можете аппроксимировать вероятность столкновения как e^(-n^2/(2^(b+1))), где n - количество документов, а b - количество битов. График этой формулы с n = 100,000 , похоже, вы захотите b> 45 по крайней мере.Я был бы более склонен пойти с 64, чтобы сделать это хорошее и круглое число.Тем не менее, есть ли у вас план действий в случае коллизий, если они происходят (может, немного изменить временную метку или добавить одноразовый номер?)

В этом отношении, если sha1 основан не только на содержимомдокумент, почему бы просто не сделать его случайным идентификатором?В этом случае столкновения представляют меньшую проблему, поскольку вы всегда можете сгенерировать новое случайное число и повторить попытку (однако вероятность столкновения с одной попыткой одинакова).

2 голосов
/ 18 декабря 2012

Будьте осторожны с усечением, поскольку нет никаких доказательств того, что меньший хеш является безопасным.См. http://csrc.nist.gov/groups/ST/hash/documents/Kelsey_Truncation.pdf. Келси. Келси приводит эвристические аргументы, утверждающие то же самое («Связанные выходы хеша» и «Ближайшие коллизии»).Бихам / Чен предлагают примеры ближних столкновений;и Кнудсен демонстрирует усеченные дифференциалы.

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

1 голос
/ 24 января 2011

Это обобщение из проблема дня рождения .В вашем случае n - это количество документов, и вместо константы 365 у вас будет количество возможностей, которые дает отсечка (поэтому для k битов это 2 k ).

Конечно, точный расчет невозможен, но вы можете использовать приблизительное значение .

1 голос
/ 24 января 2011

Там действительно нет значения для этого; Отчасти то, что делает SHA хорошим алгоритмом хеширования общего назначения, заключается в том, что подобные данные не обязательно дают аналогичные значения хеширования. Лучше всего (не зная ничего о вашей системе) будет просто выполнить поиск в списке документов, хэши которых начинаются со значения, предоставленного пользователем, а затем либо предоставить им список документов для выбора, либо перейти непосредственно к документу. если есть только один.

0 голосов
/ 24 января 2011

Что ж, вот, возможно, слишком упрощенный ответ ..

Если при полном sha1 вы получаете примерно 1 из 2 ^ 160 шансов на столкновение, то, урезая один символ, вы увеличиваете вероятность столкновения на 16(все возможные значения усеченного символа) ... который равен 2 ^ 4 .. Итак, если вы усекаете x символов, вы получаете 1 из 2 ^ (160 - 4 * x) шансов на столкновение .. верно?

...