生日悖论及生日攻击
鸽巢原理:给定n个鸽巢,至少存在n+1只鸽子,那总是会发生碰撞。
概率环境:我们需要多少个物体(鸽子)使得发生碰撞的概率大于1/2?
答案是n1/2,而不是n/2。
举个例子,想象一位老师问一个有30名学生的班级(n = 30)每个人的生日在哪一天(为简便,此处省略闰年)以确定是否有两个学生同一天生日(对应碰撞)。从直觉角度考虑,机率看起来很小。若老师选择特定日期(例如9月16日),则至少有一名学生在那天出生的几率是
,约为7.9%。但是,与我们的直觉相反的是,至少一名学生和另外任意一名学生有着相同生日的几率大约为70.63%(n = 30时),从方程
中可看出。
帮助理解:阮一峰 哈希碰撞与生日攻击
生日悖论界限
均匀随机地从N个物体抽取n个(可替换),确定碰撞的概率。
- 在N个对象中,可以构造N(N-1)/2对。
- 对于任意对,碰撞的概率为N-1
- 假设相互独立,估计碰撞的平均此时等于:
n ‾ c o l l ≈ n ( n − 1 ) 2 N \overline{n}_{coll}\approx\frac{n(n-1)}{2N} ncoll≈2Nn(n−1)
如果
n
‾
c
o
l
l
=
1
\overline{n}_{coll}=1
ncoll=1
则
n
≈
2
N
n\approx2\sqrt N
n≈2N
当n << N1/2,概率极小。相应的,当n = 0(N1/2),碰撞的可能性不可忽略。
计算反向事件发生的概率,即从N个物体中抽取n个物体不发生碰撞的概率。
∏
i
=
0
n
−
1
N
−
i
N
\prod_{i=0}^{n-1}{N-i \over {N}}
i=0∏n−1NN−i
由泰勒公式推导。(下图中花N对应上面N,下图N对应上述n)