假设GUID始终是唯一的,是否安全?
我知道发生冲突的可能性很小,但是如果我生成了一批1000个GUID(例如),那么假设它们都是唯一的以保存每一个GUID,那么是否安全?
奖金的问题
testingGUID唯一性的最佳方法是什么? 布隆filter可能?
是的你可以。 由于GUID是128比特长,可以肯定的是一个冲突的可能性很小 – 但“分”这个词远远不够强。 有这么多的GUID ,如果你随机产生几万亿 ,你更有可能被陨石击中,甚至有一次碰撞(来自维基百科 )。 如果您不是随机产生它们,而是例如使用MAC地址和时间戳algorithm,那么它们也将是唯一的,因为MAC地址在计算机中是唯一的,并且时间戳是唯一的电脑。
编辑1:要回答您的奖金问题,testing一组GUID唯一性的最佳方法是假设它们都是唯一的。 为什么? 因为,根据你生成的GUID数量,GUID碰撞的几率要比你的计算机内存中翻转的宇宙射线的几率小,并且由你所关心的任何“精确”algorithm给出答案跑步。 (请参阅math的这个StackOverflow答案 。)
那里有大量的GUID。 引用道格拉斯·亚当斯的“ 银河系漫游指南”
它说,“太空”很大,真的很大,你不会相信它有多么大的意义,我认为你可能认为在化学家的道路上还有很长的路要走,但这只是空间的花生,听…“
而由于宇宙中约有7×10 22颗恒星 ,只有不到2 128颗恒星,所以每颗恒星约有4.86×10 15 – 几乎五十亿 -GUID。 如果每一颗恒星都拥有一个像我们这样蓬勃发展的世界,那么在每一颗恒星周围, 每一个曾经居住过的人或外星人都将有权获得超过四万五千的GUID。 对于宇宙中每颗星星的历史上的每一个人。 GUID空间与整个宇宙的大小相同。 你不用担心。
( 编辑2:反思这个:哇,我没有意识到这是什么意思,这个GUID空间是不可思议的巨大的,我有点敬畏。
简短的回答:为了实际目的,是的。
但是,你必须考虑生日悖论!
我计算了几个有代表性的碰撞概率。 使用维基百科文章中指定的122位UUID,如果至less生成2.71492e18
UUID,则碰撞概率为1/2。 用10 ^ 19个UUID,概率是0.999918。 10 ^ 17 UUID,0.000939953。
在维基百科上可以find一些用于比较的数字。 因此,您可以安全地为每个已经居住的人,可观察宇宙中的每个星系,海洋中的每条鱼以及地球上的每只ant分配一个UUID。 然而 ,如果您为一年内每个晶体pipe产生一个UUID,地球上的每个昆虫,地球上的每颗沙子,可观察的宇宙中的每颗恒星,或任何更大的物体,碰撞几乎都是确定的。
如果每秒产生10亿个UUID,碰撞概率将达到10% 大约需要36年的时间 。
最终,在人类历史上所产生的一组UUID可能会相互冲突。 尽pipe如此,UUID碰撞的概率将被用于相同的目的,这个概率是微乎其微的,所以在实践中没有问题。
一般来说,是的,这是安全的假设。
如果你的GUID生成器是真正的随机的,1000个GUID内冲突的可能性是非常小的。
当然,这假设一个很好的GUID生成器。 所以这个问题真的是你相信你用来生成GUID的工具,它有它自己的testing吗?
在Wikipedia上可以find碰撞可能性的分析: http : //en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates
正如链接中提到的,这将受到随机数生成器的属性的影响。
在GUID生成器代码中也存在一个错误的可能性; 虽然机会很低,但它们可能高于基于math的碰撞机会。
布隆filter可能是适当的; 它可以快速告诉你,如果一个GUID是唯一的,但有一个错误的指示碰撞的机会。 如果您一次testing批次,另一种方法是对批次进行sorting并比较每个连续的元素。
虽然碰撞是可能的,但是这是不太可能的。 ( 这里的math)假设他们实际上是不同的是安全的。