使用 32 位散列时的冲突概率

Posted

技术标签:

【中文标题】使用 32 位散列时的冲突概率【英文标题】:Probability of collision when using a 32 bit hash 【发布时间】:2012-12-22 00:42:08 【问题描述】:

我在数据库中有一个 10 字符的字符串键字段。我已经使用 CRC32 来散列这个字段,但我担心重复。有人可以告诉我在这种情况下发生碰撞的概率吗?

附言我的字符串字段在数据库中是唯一的。如果字符串字段数为100万,碰撞概率是多少?

【问题讨论】:

【参考方案1】:

在您引用的情况下,基本上可以保证至少发生一次碰撞。至少发生一次碰撞的概率约为 1 - 3x10-51。您预计的平均碰撞次数约为 116。

一般情况下,k 个样本中的平均碰撞次数,每个样本在 n 个可能值中随机选择为:

至少发生一次碰撞的概率为:

在您的情况下,n = 232k = 106

在您的情况下,路碰撞的概率约为 0.01。请参阅Birthday Problem。

【讨论】:

非常感谢,不知道这个概率还是要靠CRC32算法? 任何好的 32 位散列算法都会给出完全相同的结果。【参考方案2】:

Expected collisions for perfect 32bit crc 的副本

答案参考本文:http://arstechnica.com/civis/viewtopic.php?f=20&t=149670

找到以下图片来自:http://preshing.com/20110504/hash-collision-probabilities

【讨论】:

以上是关于使用 32 位散列时的冲突概率的主要内容,如果未能解决你的问题,请参考以下文章

删除字节时的 SHA 冲突概率

十散列表

crypto/md5

散列表的平均查找长度怎么计算?

如何按值对 LevelDB 进行排序

具有 32 位整数的低冲突率的快速字符串散列算法 [关闭]