假定GUID始终是唯一的是否安全?


123

我知道发生冲突的可能性很小,但是如果我生成了1000个GUID(例如),可以安全地假设它们都是唯一的,以免保存每个GUID吗?

奖金问题

一种测试GUID唯一性的最佳方法?布隆过滤器也许?



29
若大家都保持糖化本网站上的Reload按钮:wasteaguid.info
mipadi

12
我将所有错误归咎于GUID冲突。它必须发生一些时间吧?
迈克尔

8
鲨鱼有漂亮的格子图案着色的可能性很可能会从天上掉下来,将计算机粉碎成碎片,所以我认为采取预防措施是对资源进行更适当分配的一部分,以降低整体风险计划。
David Gladfelter 2010年

4
@mipadi:很棒的链接!我可以想象某个开发人员在某个地方抱怨“ Guuuuy!停止浪费GUID!我需要那些!”
FrustratedWithFormsDesigner

Answers:


360

是的你可以。由于GUID的长度为128位,因此冲突的可能性很小,但“分钟”一词的强度还远远不够。有这么多的GUID,如果你产生数万亿他们随机,你还更容易得到由陨石撞击,而不是有连一个碰撞(来自维基百科)。而且,如果您不是随机生成它们,而是例如使用MAC地址和时间戳算法,那么它们也将是唯一的,因为MAC地址在计算机之间是唯一的,而时间戳在您的计算机上是唯一电脑。

编辑1:要回答您的奖励问题,测试一组GUID的唯一性的最佳方法是仅假设它们都是唯一的。为什么?因为,鉴于您正在生成的GUID数量,GUID碰撞的几率小于宇宙射线在计算机内存中翻转一点并弄乱了您所关心的任何“准确”算法给出的答案的几率跑步。(有关数学信息,请参见此StackOverflow答案。)

那里有大量的GUID。引用道格拉斯·亚当斯(Douglas Adams)的《银河系漫游指南》

它说:“太空很大。真的很大。你只是不敢相信它是如此之大,令人难以置信。我的意思是你可能认为这对化学家来说还有很长的路要走,但这只是通往太空的花生,听……”

而且,由于有大约7×10 22分在宇宙中,和不到2点128的GUID,则有大约4.86×10 15个 -almost 5个千万亿为每一个星-GUIDs。如果这些星星中的每一个都有一个像我们这样繁华人口的世界,那么每一颗星星周围,每一个曾经生活过的人类或外星人都将有权获得超过四万五千GUID。对于历史上每个人在宇宙中每一个恒星。GUID空间的巨大程度与整个宇宙的大小相同。你没有必要担心。

编辑2:对此进行反思:哇。我还没有意识到自己的意思。GUID空间巨大得无法理解。我对此感到敬畏。)


1
另外,WolframAlpha报告说,每个曾经生活的人的每个单元中,都有36万亿个UUID。您10^14体内的细胞数量大约为1065亿。或者,2.385 * 10^23美国公共债务中的每一分钱都有UUID。
new123456

5
尽管数量仍然很高,但是在2 ^ 64 GUID情况下,GUID碰撞的可能性超过50%。
NullUserException 2012年

1
在2 ^ 64 GUID的情况下,这将使宇宙中的每颗恒星的数目减少到少于一个(0.00026),对于每一个曾经居住的人类或外星人,其数目将减少到2 * 10 ^(-15)。对于每个曾经生活的来说,这仍将提供超过1.7亿个GUID ,所以我认为我们仍然很好。
NullUserException 2012年

12
值得一提的是,GUID冲突仅在相同的业务空间中也是一个问题。我用来标识软件组件的GUID可能与您在自己的应用程序的数据库行中使用的GUID相同,而不会引起任何问题
James Thorpe 2014年

1
有2 ^ 128个GUIDS的事实是无关紧要的,并且在50%的碰撞几率上您还不是“还不错”,甚至在0.0000001%时也不是很好
BlackTigerX

40

简短的回答:出于实际目的,是的。

但是,您必须考虑生日悖论!

我已经计算出一些代表性的碰撞概率。使用Wikipedia文章中指定的122位UUID时,如果您至少生成2.71492e18UUID ,则发生碰撞的可能性为1/2 。如果使用10 ^ 19 UUID,则概率为0.999918。有10 ^ 17个UUID,0.000939953。

可以在Wikipedia上找到一些用于比较的数字。因此,您可以为每个生活的人,可观测的宇宙中的每个星系,海洋中的每个鱼以及地球上的每个蚂蚁安全地分配一个UUID。但是,如果您为人类一年中生产的每个晶体管,地球上的每个昆虫,地球上的每个沙粒,可观察到的宇宙中的每个恒星或更大的物体生成一个UUID,则几乎可以确定发生碰撞。

如果每秒生成10亿个UUID,则大约需要36年才能获得10%的碰撞概率。

最终,在人类历史过程中生成的一组UUID之间可能会发生冲突。仍然会发生冲突的UUID用于同一目的的可能性很小,因此在实践中没有问题。


13
这就是宇宙的结束方式...一些程序员只是假设他们的GUID对于他们的巨型死亡之星将永远是唯一的...
pkr298 '18

因为UUID基于非随机数据,所以36年就是-您只需要担心每个毫秒。
mjaggard

@mjaggard UUID基于随机数据。无论如何,任何现代形式。
Trejkaz

8

Wikipedia上提供了碰撞可能性的分析:http : //en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

如链接中所述,这将受到随机数生成器属性的影响。

GUID生成器代码中也可能存在错误;虽然几率很小,但可能比基于数学的碰撞几率更高。

布隆过滤器可能是合适的;它可以快速告诉您GUID是否唯一,但是有可能错误提示碰撞。如果一次要测试一个批次,则另一种方法是对批次进行排序并比较每个连续的元素。


5

通常,是的,可以安全地假设。

如果您的GUID生成器确实是随机的,则在1000个GUID中发生冲突的可能性非常小。

当然,这假设一个好的GUID生成器。因此,问题实际上是关于您对用来生成GUID的工具有多信任,它是否有自己的测试?


0

虽然可能发生碰撞,但极不可能发生碰撞。(这里是数学。)可以肯定的是它们实际上是截然不同的。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.