最糟糕的情况是,我在缓存中有1.8亿个值(15分钟窗口,然后它们变得陈旧),MD5有2 ^ 128个值。碰撞的概率是多少?或者更好的是,是否有一个网页可以回答这个问题或粗略估计?那会摇滚,所以我知道我的机会。
答案 0 :(得分:6)
概率 1-m!/(mⁿ(mn)!)其中 m = 2 12 2 且 n = 180000000 。
通过在线Wolfram运行它超过了可用的计算时间!
如果您在本地安装了SmallTalk,则可以运行:
|m n p|
m := 2 raisedTo:128.
n := 180000000.
p := (1-(m factorial/((m raisedTo:n)*(m-n)factorial)))asFloat.
Transcript show:p printString;cr.
搜索生日问题会显示Wikipedia page,其中提供了一个显示128位和2.6×10 15哈希的表格,碰撞的概率是10十分之一,所以这个数字是140×哈希比你正在考虑的哈希。所以你知道你的几率比这更糟糕。
如果 n << m 是 1-e -n 2 / 2m ,那么这是一个很好的近似值,其中if你插入上面的 m 和 n ,你会得到4.76×10 -2或3或2.10×10 2中的1作为碰撞的概率。
即使碰撞的概率非常低,在FOOBAR
情况下也是谨慎的,比如说如果有问题并且哈希累积超过15分钟,至少要确认会发生什么发生碰撞事件。如果某人以某种方式注入重复的哈希以试图破坏它,这也会有所帮助。