我知道发生冲突的可能性很小,但是如果我生成了1000个GUID(例如),可以安全地假设它们都是唯一的,以免保存每个GUID吗?
奖金问题
一种测试GUID唯一性的最佳方法?布隆过滤器也许?
我知道发生冲突的可能性很小,但是如果我生成了1000个GUID(例如),可以安全地假设它们都是唯一的,以免保存每个GUID吗?
奖金问题
一种测试GUID唯一性的最佳方法?布隆过滤器也许?
Answers:
是的你可以。由于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空间巨大得无法理解。我对此感到敬畏。)
10^14
体内的细胞数量大约为1065亿。或者,2.385 * 10^23
美国公共债务中的每一分钱都有UUID。
简短的回答:出于实际目的,是的。
但是,您必须考虑生日悖论!
我已经计算出一些代表性的碰撞概率。使用Wikipedia文章中指定的122位UUID时,如果您至少生成2.71492e18
UUID ,则发生碰撞的可能性为1/2 。如果使用10 ^ 19 UUID,则概率为0.999918。有10 ^ 17个UUID,0.000939953。
可以在Wikipedia上找到一些用于比较的数字。因此,您可以为每个生活的人,可观测的宇宙中的每个星系,海洋中的每个鱼以及地球上的每个蚂蚁安全地分配一个UUID。但是,如果您为人类一年中生产的每个晶体管,地球上的每个昆虫,地球上的每个沙粒,可观察到的宇宙中的每个恒星或更大的物体生成一个UUID,则几乎可以确定发生碰撞。
如果每秒生成10亿个UUID,则大约需要36年才能获得10%的碰撞概率。
最终,在人类历史过程中生成的一组UUID之间可能会发生冲突。仍然会发生冲突的UUID用于同一目的的可能性很小,因此在实践中没有问题。
Wikipedia上提供了碰撞可能性的分析:http : //en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates
如链接中所述,这将受到随机数生成器属性的影响。
GUID生成器代码中也可能存在错误;虽然几率很小,但可能比基于数学的碰撞几率更高。
布隆过滤器可能是合适的;它可以快速告诉您GUID是否唯一,但是有可能错误提示碰撞。如果一次要测试一个批次,则另一种方法是对批次进行排序并比较每个连续的元素。