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