DataBase中的生日悖论(计算碰撞概率)

时间:2013-03-08 15:46:13

标签: database collision-detection probability collision probability-theory

根据Birthday paradox

如果我将它应用于数据库(如果我错了,请纠正我): 如果我们需要在数据库中存储UNIQUE散列数据,并且我们有一个可以生成365个唯一散列值的散列算法,那么在前23个数据条目和99.9%(!)之后有50%的可能发生数据冲突。在前75个数据库条目之后发生碰撞的可能性。

我们的算法可以生成的唯一哈希值和数据条目量可以指数增长,但冲突的可能性将保持不变。如果这样对吗?

我有一个包含交易的大表(用于电子商务),我将字段'收据'设置为唯一。而实际的收据数字是困扰我的。

收据编号示例:BHF2Z47E仅大写A-Z / 0-9,长度为8个符号。

更新

The Birthday Paradox

1 个答案:

答案 0 :(得分:1)

生日悖论只是说明如果你在n的空间中随机生成值,那么当你存储sqrt(n)值时,存在从没有碰撞到碰撞的快速相变 - 这就是概率增加的地方超过50%。

在你的例子中,你有一个26 + 10个字符和8个数字的字母;这样36^8或大约2.8万亿个可能的密钥;在大约160万个条目之后,你可以预期有超过50%的碰撞概率;那不是很好。即使只是其中的一小部分,也有可能发生碰撞。

作为比较,假设您为每个收据生成了160位随机密钥(2^160个可能的值);那么您需要生成约2^80个收据(约10^24)才能达到相同的碰撞概率。您可以将您的产品作为一个非常大的公司出售给您的整个生命,可能仍然没有看到任何。另一个观点是,在观察到碰撞之前,您的硬盘或计算机将会出现故障。

The table in this article为您提供了一些具体的数字。例如,插入256位哈希值和10^31值后,您将获得10^-15的冲突概率。根据那篇文章,这是你的硬盘无法纠正的错误率。这可能是你应该用收据瞄准的量级,以避免覆盖它们。要让这些价值变得更大,并不难。

当然,这取决于您使用随机数据正确播种PRNG的事实;否则你可以轻松获得相同的密钥:)