64位哈希函数三类碰撞概率计算及求解方法咨询
前置假设
我们默认讨论的是理想均匀哈希函数,即所有输出结果概率均等、无偏向性,64位输出的总可能取值数为 N = 2^64。
各问题解答
a) 找任意两个不同输入的哈希碰撞,50%概率所需计算次数
这个场景是经典生日悖论的直接应用:
推导逻辑:k次哈希计算后,不存在任何碰撞的概率为:
P(无碰撞) = ∏(i=1到k-1) (1 - i/N)
用泰勒近似简化(当N远大于k时,ln(1-x)≈-x),可得:ln(P(无碰撞)) ≈ -k(k-1)/(2N)
要求碰撞概率为50%,即P(无碰撞)=0.5,代入得:k ≈ 1.177 * √N
代入N=2^64计算,最终结果约为5.05 * 10^9,近似可以记为2^32次(约42亿次)。
b) 匹配指定哈希摘要h,50%概率所需计算次数
这个场景属于原像攻击,不适用生日悖论:
推导逻辑:每次哈希计算命中目标h的概率为 1/N,k次计算全部未命中的概率为:
P(未命中) = (1 - 1/N)^k ≈ e^(-k/N)
要求命中概率为50%,即P(未命中)=0.5,代入得:k ≈ ln2 * N ≈ 0.693 * 2^64
近似可以记为2^63次(约9.2 * 10^18次)。
c) 匹配指定输入m1的哈希值,50%概率所需计算次数
这个场景和问题b完全等价:m1的哈希值是固定的一个结果,本质还是找某个固定哈希值的原像,推导逻辑和最终结果和b完全一致,近似需要 2^63 次计算。
关于生日悖论的适用范围说明
只有问题a可以直接用生日悖论求解:生日悖论的核心是计算k个样本的两两配对数量(总共有 k*(k-1)/2 个配对),配对数量随k呈平方级增长,所以所需计算次数是总输出空间的平方根级别。
问题b、c都是找样本和单个固定值的匹配,有效匹配次数只有k次,随k线性增长,因此不能用生日悖论的公式,需要用原像攻击的概率逻辑计算。
内容的提问来源于stack exchange,提问作者Tony Miller

