您可以截断多少SHA1哈希并合理确定拥有唯一ID?

dan*_*dan 17 algorithm sha1 probability hmac

我正在创建一个存储文档的应用程序,并根据一些内容(包括时间戳)的SHA1摘要为每个文档提供一个UID.摘要有很多字符,我想允许用户使用完整摘要的前x个字符来识别文档.如果文档的数量可能在10K到100K左右,x的价值是多少?

bdo*_*lan 20

维基百科上调整公式以解决生日问题,您可以将碰撞概率近似为e^(-n^2/(2^(b+1))),n文档计数在哪里以及b位数.用n = 100,000绘制这个公式,看起来你至少要b> 45.我更倾向于使用64来使它成为一个漂亮的圆形数字.也就是说,如果发生碰撞,确实有计划处理碰撞(可能会略微改变时间戳,或添加一个nonce?)

就此而言,如果sha1不仅仅基于文档的内容,为什么不简单地将它作为随机ID呢?在这种情况下,碰撞不是一个问题,因为你总是可以生成一个新的随机数并再试一次(然而,与单次尝试碰撞的概率是相同的).

  • Marc Stevens 在 MD5 和 SHA 上是 [工程前缀冲突](https://marc-stevens.nl/p/hashclash/)。他正在做一些事情来导致预期分布的崩溃:) 因此,仅仅截断并期望较小的散列具有与减小的位大小相同的安全性可能还不够。 (2认同)