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

时间:2010-06-04 20:30:26

标签: math unique guid probability collision

我知道碰撞的可能性很小但是如果我生成了一批1000个GUID(例如),那么可以安全地假设它们都是唯一保存测试的吗?

加分问题

测试GUID唯一性的最佳方法?布隆过滤器可能吗?

7 个答案:

答案 0 :(得分:324)

是的,你可以。由于GUID长度为128位,因此肯定会有一分钟冲突的可能性 - 但“分钟”这个词远远不够强大。有这么多的GUID ,如果你随机生成几万亿,你更有可能被陨石击中而不是甚至一次碰撞(来自{ {3}})。如果你没有随机生成它们,但是例如使用MAC-address-and-time-stamp算法,那么它们也将是唯一的,因为MAC地址在计算机中是唯一的 计算机上的时间戳是唯一的。

编辑1:要回答您的红利问题,测试一组GUID的唯一性的最佳方法是假设它们都是唯一的。为什么?因为,考虑到你正在生成的GUID的数量,GUID冲突的几率小于宇宙射线在计算机内存中稍微翻转的几率,并搞砸了你所关心的任何“准确”算法给出的答案跑步。 (有关数学的信息,请参阅Wikipedia。)

那里有一些巨大的数量的GUID。引用道格拉斯亚当斯的 Hitchhiker银河系指南

  “空间,”它说,“很大。真的很大。你只是不会相信这是多么大的令人难以置信的大。我的意思是你可能认为这对化学家来说还有很长的路要走,但这只是花生到太空,听......“

由于有this StackOverflow answer,并且刚好低于2 128 GUID,那么大约有4.86×10 15 - 几乎五千万亿< / em> -GUIDs为每一颗星。如果这些恒星中的每一个都拥有像我们这样繁荣的人口世界,那么每个恒星周围的 about 7×1022 stars in the universe 将有权获得超过四万五千个GUID。对于宇宙中每颗恒星的历史上的每个人。 GUID空间与整个Universe的大小处于同一级别。你需要担心。

编辑2:反思这个:哇。我没有意识到我自己这意味着什么.GUID空间难以理解。我有点像敬畏。)

答案 1 :(得分:37)

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

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

我计算了一些有代表性的碰撞概率。对于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,it would take about 36 years可以获得10%的碰撞概率。

最终,在人类历史进程中产生的UUID集之间可能会发生冲突。碰撞的UUID用于同一目的的概率仍然很小,因此在实践中没有问题。

答案 2 :(得分:8)

维基百科上可以分析碰撞的可能性:http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

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

GUID生成器代码中也可能存在错误;虽然机会很低,但它们可能高于基于数学的碰撞机会。

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

答案 3 :(得分:5)

一般来说,是的,可以安全地假设。

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

当然,这假设一个好的GUID生成器。所以问题实际上是你相信你用来生成GUID的工具有多少,它是否有自己的测试?

答案 4 :(得分:0)

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

答案 5 :(得分:0)

答案 6 :(得分:0)

这个话题让我想起了纸牌场景。也就是说,一副 52 张牌的排列方式有很多种,几乎可以肯定的是,没有 2 副正确洗牌的曾经存在过的一副牌是按相同顺序排列的。

如果你现在拿一副套牌洗牌,这个序列将是独一无二的,并且可能永远不会在全人类中再次出现。事实上,排列 52 任何东西的潜在方法数量如此之多,以至于任何 2 副牌碰巧出现相同顺序的可能性都接近于零。

在这个有 40 张洗牌套牌的例子中,并想确定它们都是独一无二的,其中 2 张是相同的并非不可能,但如果您能够一次洗牌所有套牌,则很可能不会发生这种情况每 10 秒,你就开始了宇宙的诞生。