我知道冲突的可能性很小,但是如果我生成了一批1000个GUID(例如),那么假设每个GUID都是唯一的保存测试是安全的吗?
奖金问题
检验GUID唯一性的最佳方法?也许是布卢姆过滤器?
发布于 2011-09-30 08:52:24
简短的回答:为了实用目的,是的。
然而,你必须考虑生日悖论!
我计算了几个有代表性的碰撞概率。对于维基百科文章中指定的122位UUID,如果至少生成2.71492e18 UUID,则冲突的概率为1/2。对于10^19个UUID,概率为0.999918。10^17 UUID,0.000939953。
一些比较的数字可以在维基百科上找到。这样你就可以安全地为每一个已经生活过的人,在可观测的宇宙中的每一个星系,海洋中的每一条鱼,以及地球上的每一只蚂蚁指定一个UUID。然而,碰撞几乎是肯定的,如果你产生一个UUID为每个晶体管人类在一年,地球上的每一昆虫,地球上的每一粒沙子,每一颗恒星在可观测的宇宙,或任何更大的。
如果每秒生成10亿UUID,大概要36年将获得10%的碰撞概率。
最终,在人类历史进程中生成的一组UUID之间可能会发生冲突。尽管如此,被碰撞的UUID用于同样目的的可能性仍然非常小,因此在实践中没有问题。
发布于 2010-06-04 21:17:54
关于碰撞可能性的分析可以在维基百科上找到:复本。
正如链接中提到的,这将受到随机数生成器属性的影响。
GUID生成器代码中也存在bug的可能性;虽然几率很低,但它们可能高于基于数学的碰撞概率。
Bloom过滤器可能是适当的;它可以快速地告诉您GUID是否是唯一的,但是有可能出现错误的碰撞指示。如果一次测试一个批处理,另一种方法是对批处理进行排序,并比较每个连续的元素。
发布于 2010-06-04 20:33:43
一般来说,是的,这是安全的假设。
如果GUID生成器确实是随机的,则1000 GUID中冲突的可能性非常小。
当然,这假设了一个好的GUID生成器。所以问题是你有多信任你用来生成GUID的工具,它有它自己的测试吗?
https://stackoverflow.com/questions/2977593
复制相似问题