23 人的房间就有 50% 概率出现相同生日,60 人中三人同生日的概率远高于直觉。这背后的数学,正是哈希碰撞和生日攻击的基础。
一个房间里只有你一个人,生日重复的概率是零。但随着人数增加,这个概率涨得比你想象中快得多。只要 23 个人,就有 50% 的概率出现两人同一天生日。这就是著名的生日悖论。
计算方式很简单,23 个人中没有人生日重复的概率是 365/365 乘以 364/365 乘 363/365 一直乘到 343/365,结果约等于 0.4927。
但同样的问题还有个更有趣的版本。1930 年代,一家保险公司数学部的员工发现公司 60 人中竟有三人同一天生日,他们想算算这有多罕见。他们用标准方法算出的概率只有 0.0006,也就是几千分之几。
结果算对了,但角度错了。
1939 年,奥地利数学家 Richard von Mises 解释了为什么。他在伊斯坦布尔大学的论文中完全颠覆了看待这个问题的视角。保险公司的员工算的是"某三个人在某个特定日子重合生日"的概率。但 von Mises 问的是:"60 个人里,任意三人同一天生日的概率是多少?"
他把这称为占据概率问题。想象面前有 365 个盒子往里扔 60 个球。保险公司员工关注的是第 3 号盒子里是否至少有三个球。von Mises 关注的是所有盒子里有多少出现了至少三个球。后者的成功条件宽泛得多,概率自然也大得多。
代入 von Mises 的公式计算 60 人中三人同生日的期望值,结果大约是 0.22。这意味着大约每 4 到 5 组 60 人的人群中,就会出现一组有三人生日重合的情况。而不是保险公司员工算出的每 1500 到 2000 组才出现一次。
这个数学原理在网络安全中直接对应着生日攻击。攻击者不断生成随机输入,直到有两个输入产生相同的哈希值。任何一对碰撞就足以破坏系统,不需要针对特定的哈希值。破解 SHA-256 需要 2 的 128 次方次尝试,这比暴力破解所有 2 的 256 次方个输出要少得多。哈希表的碰撞和生日问题共享着同一个数学基础,只不过日期变成了表字段,人变成了哈希值。