如果我有一个URL索引,并用SHA1哈希的前8个字符对它们进行ID,那么两个不同URL具有相同ID的概率是多少?
答案 0 :(得分:20)
@Teepeemm已经正确回答了相关问题'给定8个十六进制数字的特定序列,用相同的 8位数出现另一个SHA-1哈希的几率是多少?'这是一个非常小的号。
这个问题的关键是一个不同的问题:'给定大量的8位十六进制数字序列,它们中任何两个相同的可能性是多少?'正如对问题的第一个评论所指出的那样,这与birthday paradox有关,这不是'房间里有人和我一样生日的机会是什么?'而是'有什么机会< em>任何这个房间里的两个人生日相同吗?'众所周知,只有23人才有50%的机会。
哈希冲突问题基本上是同一个问题,但是从 N = 365 天到 N = 16 ^ 8 8字节序列,大约是4.30 E9。这是‘generalised birthday problem’。使用那里引用的表达式( n = sqrt(2 * d * ln(1 /(1-p))),其中 d = 4.30e9 和 p = 0.5 ,我们发现仅有77000次试验发生碰撞的可能性为50%。如果你绘制相应的函数,你会发现随着试验次数的增加,概率会迅速增加。
即使有16个字节的散列(所以 d = 16 ^ 16 ),只有50亿次试验后有50%的机会发生碰撞。
生日快乐!
答案 1 :(得分:2)
SHA-1哈希有40个base-16数字。如果您只查看前8个,那么第二个网址具有相同8位数的概率为(1/16)^8 ~ 2.32e-10
。实际上,这并不取决于开始时有40个数字,甚至不是它的SHA-1。您需要的唯一假设是SHA-1具有独立且前缀相同的前8位数字。