如何计算哈希算法中碰撞的几率?

时间:2009-03-25 14:36:42

标签: algorithm math hash

假设我有一个哈希算法,它很好而且流畅(任何一个哈希值的出现几率都与其他值相同)。

现在说我知道挑选2个哈希并且发生碰撞的几率是(为了论证)50000:1。

现在说我挑了100个哈希。考虑到一组2中碰撞的几率,如何计算该100个值内的碰撞几率?

对此的一般解决方案是什么,以便我可以提出一些哈希尝试,之后赔率低于某个可接受的阈值?例如。我可以说“一批49999哈希值创作有很高的碰撞机会”。

5 个答案:

答案 0 :(得分:10)

答案 1 :(得分:5)

这听起来很像我Birthday Paradox

您应该能够用可能的哈希值(50000)替换可能的生日集(365)并运行它们在那里进行的相同计算。

如果你修改文章中提供的python脚本的值:

 def bp(n, d):
    v = 1.0
    for i in range(n):

         v = v * (1 - float(i)/d)
    return 1 - v

 print bp(2, 50000)

你最终得到两个0.00002的碰撞几率。大约265个样本,你有大约50%的机会发生碰撞。

答案 2 :(得分:5)

首先计算没有碰撞的概率:

hashes_picked = 100
single_collision_odds = 50000

# safe_combinations is number of ways to pick hashes that don't overlap
safe_combinations = factorial(single_collision_odds) / factorial(single_collision_odds - hashes_picked)

# all_combinations is total number of ways to pick hashes
all_combinations = single_collision_odds ** hashes_picked   

collision_chance = (all_combinations - safe_combinations) / all_combinations

答案 3 :(得分:1)

这称为the Birthday problem。要解决这个问题,请考虑一下 no 碰撞的可能性(称之为p nc )。

  • p nc (1)= 1
  • p nc (2)= 1 - p c (2)
  • p nc (3)= p nc (2)* p nc (2)* p nc (2)

答案 4 :(得分:0)

和JS

function calculate(n,k)
{

    var result =1;
    for (var i=0; i<k; i++){
        result=result*n/(n-i)
    }
    result=(1-1/result)*100;
    return result;
}