根据Birthday paradox
:
如果我将它应用于数据库(如果我错了,请纠正我):
如果我们需要在数据库中存储UNIQUE
散列数据,并且我们有一个可以生成365个唯一散列值的散列算法,那么在前23个数据条目和99.9%(!)之后有50%的可能发生数据冲突。在前75个数据库条目之后发生碰撞的可能性。
我们的算法可以生成的唯一哈希值和数据条目量可以指数增长,但冲突的可能性将保持不变。如果这样对吗?
我有一个包含交易的大表(用于电子商务),我将字段'收据'设置为唯一。而实际的收据数字是困扰我的。
收据编号示例:BHF2Z47E
仅大写A-Z / 0-9,长度为8个符号。
更新
答案 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的事实;否则你可以轻松获得相同的密钥:)