2010-06-04 75 views
71

我知道存在冲突的可能性很小,但是如果我生成了一批1000个GUID(例如),是否可以安全地假设它们都是唯一的以便保存每个测试的测试?假设一个GUID始终是唯一的是否安全?

奖金问题

测试一个GUID的唯一性的最佳方式是什么?布隆过滤器可能?

+2

[GUID是否100%时间是唯一的?](http://stackoverflow.com/questions/39771/is-a-guid-unique-100-of-the-time) – ChrisF 2010-06-04 20:31:34

+20

不是我们都会继续在本站点上重新加载按钮:http://www.wasteaguid.info/ – mipadi 2010-06-04 20:32:04

+9

我把所有的错误归咎于GUID碰撞。它必须发生一段时间吗? – Michael 2010-06-04 20:34:57

回答

257

是的,可以。由于GUID是128位长,所以出现冲突的可能性很小 - 但“分”这个词远不够强。有这么多GUID,如果你随机产生几万亿,你更有可能被陨石击中,甚至碰到一次碰撞(从Wikipedia)。如果您不是随机生成它们的,但是例如使用MAC地址和时间戳算法,那么它们也将是唯一的,因为MAC地址在计算机中是唯一的,并且时间戳在您的计算机上是唯一的。

编辑1:要回答你的奖金问题,测试一组唯一GUID的最佳方法是假设它们都是唯一的。为什么?因为,鉴于您生成的GUID数量,GUID碰撞的几率比计算机内存中宇宙射线翻转一点点的几率要小,并且由您关心的任何“准确”算法给出答案跑步。 (数学见this StackOverflow answer

有一个巨大的在那里的GUID数量。引述道格拉斯·亚当斯的漫游指南银河:。

“空间,”它说,“大真大,你就不会相信它是多么千差万别巨大mindbogglingly大我的意思是,你可能认为这是一个很长的路下山的路向化学家,但是这只是花生空间,听......”

而且因为有about 7×1022 stars in the universe,和不到2点128点的GUID,则有大约4.86×10 -almost five quadrillion -GUIDs为每一颗恒星。如果这些明星中的每一个都拥有像我们这样蓬勃发展的世界,那么围绕每一颗明星,将有权获得超过四万五千个GUID。对于宇宙中每颗恒星的历史上的每一个人。 GUID空间与整个宇宙的大小处于同一水平。你做不是需要担心。

编辑2:反思这一点:哇,我没有意识到自己什么这意味着GUID空间是不可思议的海量我的敬畏它是排序的。)

+68

引用搭便车的+1 – 2010-06-04 21:20:20

+0

此外,WolframAlpha报告说,对于每个曾经住过的人的每个细胞,有36万亿个UUID。你身上有大约10^14个细胞,有1065亿人曾经生活过。或者,美国公共债务中的每一分钱都有2.385 * 10^23个UUID。 – new123456 2011-08-11 01:47:14

+4

虽然数字仍然很高,但GUID冲突的概率在2^64 GUID处超过50%。 – NullUserException 2012-10-22 23:23:52

0

虽然碰撞是可能的,但这是不太可能的。 (数学here。)假设它们实际上是不同的是安全的。

5

一般来说,是的,它是安全的假设。

如果您的GUID生成器是真正随机的,1000个GUID内冲突的可能性非常小。

当然,这假设一个很好的GUID生成器。所以问题是关于您对用于生成GUID的工具的信任程度以及是否有自己的测试?

4

在Wikipedia上可以找到碰撞可能性的分析:http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

正如在链接中提到的那样,这将受到随机数生成器的属性的影响。

GUID生成器代码中还存在一个bug的可能性;虽然机会很低,但它们可能高于基于数学的碰撞机会。

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

30

简答:为了实际目的,是的。

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

我计算了一些有代表性的碰撞概率。使用the Wikipedia article中指定的122位UUID,如果至少生成了2.71492e18 UUID,则碰撞概率为1/2。使用10^19个UUID,概率为0.999918。有10^17个UUID,0.000939953。

Some numbers for comparison can be found on Wikipedia.因此,您可以安全地为每个已经居住的人,可观察宇宙中的每个星系,海洋中的每条鱼以及地球上的每只蚂蚁分配一个UUID。 但是,如果您为一年内人类产生的每个晶体管,地球上的每个昆虫,地球上的每颗沙子,可观察宇宙中的每颗恒星或任何更大的物体生成UUID,碰撞几乎可以确定。

如果您每秒产生10亿个UUID,则可获得10%的碰撞概率it would take about 36 years

最终,在人类历史过程中产生的一组UUID可能会发生碰撞。尽管如此,UUID碰撞的概率将被用于相同的目的,但实际上并没有问题。

+0

这就是宇宙结束......一些程序员只是假设他们的GUID对于他们的巨型死星来说总是唯一的...... – pkr298 2018-02-26 22:04:42

相关问题