我正在制作一个存储文件的应用程序,并根据包括时间戳在内的一些内容的SHA1摘要为每个文件提供一个UID。摘要有很多字符,我希望允许用户使用完整摘要的前x个字符来识别文档。如果文档数量可能在10K-100K左右,那么x的一个好值是什么?
调整Wikipedia上有关生日问题的公式,您可以将碰撞概率近似为1 - e^(-n^2/(2^(b+1))),其中n文档数和b位数是。用n = 100,000绘制该公式,看起来您至少需要b> 45。我更倾向于使用64,使其成为一个不错的整数。也就是说,是否有应对冲突的计划(可能会稍微更改时间戳或添加随机数?)
1 - e^(-n^2/(2^(b+1)))
n
b
为此,如果sha1不仅基于文档的内容,为什么不简单地使其成为随机ID?在这种情况下,冲突就不再是问题,因为您始终可以生成一个新的随机数并重试(但是一次尝试发生冲突的可能性是相同的)。