假设我有一个哈希算法,而且它是不错的(任何一个哈希值出现的概率与其他值相同)。
现在假设我知道选取2个哈希值并且它们发生冲突的概率(为了方便)是50000:1。
如果我选取了100个哈希值,如何计算在这一组100个值中发生冲突的概率,考虑到在2个值的集合中发生冲突的概率?
如何得出一般解决方案,以便我可以计算出在某些可接受的阈值以下的哈希尝试数量?例如,我可以说“49999个哈希值批次存在高碰撞概率”。
假设我有一个哈希算法,而且它是不错的(任何一个哈希值出现的概率与其他值相同)。
现在假设我知道选取2个哈希值并且它们发生冲突的概率(为了方便)是50000:1。
如果我选取了100个哈希值,如何计算在这一组100个值中发生冲突的概率,考虑到在2个值的集合中发生冲突的概率?
如何得出一般解决方案,以便我可以计算出在某些可接受的阈值以下的哈希尝试数量?例如,我可以说“49999个哈希值批次存在高碰撞概率”。
首先计算没有碰撞的概率:
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
2 ** 3 == 8
。 - recursive这被称为生日问题。要解决它,考虑不发生碰撞的概率(记为pnc)。
而在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;
}