Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 假设GUID总是唯一的安全吗?_Math_Unique_Guid_Probability_Collision - Fatal编程技术网

Math 假设GUID总是唯一的安全吗?

Math 假设GUID总是唯一的安全吗?,math,unique,guid,probability,collision,Math,Unique,Guid,Probability,Collision,我知道有一小部分可能发生冲突,但如果我生成了一批1000个guid(例如),是否可以安全地假设它们都是唯一的,以保存对每个guid的测试 奖金问题 测试GUID唯一性的最佳方法?也许是布卢姆过滤器 虽然可能发生碰撞,但可能性很小。(数学)可以安全地假设它们实际上是不同的。一般来说,是的,可以安全地假设 如果GUID生成器是真正随机的,那么1000个GUID中发生冲突的可能性非常小 当然,这需要一个良好的GUID生成器。因此,问题实际上是关于您对用于生成GUID的工具的信任程度,以及它是否有自己的

我知道有一小部分可能发生冲突,但如果我生成了一批1000个guid(例如),是否可以安全地假设它们都是唯一的,以保存对每个guid的测试

奖金问题


测试GUID唯一性的最佳方法?也许是布卢姆过滤器

虽然可能发生碰撞,但可能性很小。(数学)可以安全地假设它们实际上是不同的。

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

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


当然,这需要一个良好的GUID生成器。因此,问题实际上是关于您对用于生成GUID的工具的信任程度,以及它是否有自己的测试?

通常这是一个非常安全的假设


是的,你可以。由于guid的长度为128位,因此不可否认,发生冲突的可能性很小,但“分钟”一词的强度远远不够。有如此多的guid,如果你随机生成数万亿个guid,你仍然更有可能被陨石击中,而不是发生一次碰撞。如果您不是随机生成它们,而是使用MAC地址和时间戳算法,那么它们也将是唯一的,因为MAC地址在计算机中是唯一的,时间戳在您的计算机上也是唯一的

编辑1:要回答您的奖金问题,测试一组GUID唯一性的最佳方法就是假设它们都是唯一的。为什么?因为,考虑到你正在生成的GUID的数量,GUID冲突的几率要小于宇宙射线在你的计算机内存中翻转一点,并把你想运行的任何“精确”算法给出的答案弄糟的几率。(有关数学知识,请参见。)

有大量的guid。引用道格拉斯·亚当斯的《银河系搭便车指南》:

“空间,”它说,“很大。真的很大。你不会相信它有多大。我的意思是,你可能认为它离化学家还有很长的路要走,但这对空间来说只是小菜一碟,听着……”

因为有,并且刚好在2128个guid之下,那么每一颗恒星大约有4.86×1015个,几乎五个万亿的guid。如果这些恒星中的每一颗都有一个像我们这样人口繁衍的世界,那么每一颗恒星周围都有四万五千多个吉德。为了历史上的每一个人,为了宇宙中的每一颗星星。GUID空间的巨大程度与整个宇宙的大小相同。你不必担心


编辑2:反思这一点:哇。我还没有意识到这意味着什么。GUID空间巨大得令人无法理解。我有点敬畏它。)

维基百科上提供了关于冲突可能性的分析:

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

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


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

简短回答:出于实际目的,可以

<>但是,你必须考虑生日悖论! 我计算了一些有代表性的碰撞概率。对于中指定的122位UUID,如果生成至少
2.71492e18
UUID,则冲突概率为1/2。对于10^19个UUID,概率为0.999918。有10^17个UUID,0.000939953

因此,您可以安全地为每个生活过的人类、可观测宇宙中的每个星系、海洋中的每条鱼以及地球上的每只蚂蚁分配UUID。然而,如果你为人类一年内生产的每一种晶体管、地球上的每一种昆虫、地球上的每一粒沙子、可观测宇宙中的每一颗恒星或任何更大的东西生成UUID,碰撞几乎是肯定的

如果每秒生成10亿个UUID,则碰撞概率为10%


最终,在人类历史过程中产生的UUID集之间可能会发生冲突。尽管如此,被碰撞的UUID用于相同目的的可能性非常小,因此在实践中没有问题。

这个主题让我想起了一副牌的场景。这就是说,52张牌的牌组有很多种排列方式,几乎可以肯定的是,从来没有两张经过适当洗牌的牌组是以相同的顺序排列的

如果你现在拿一副牌并洗牌,那么这个序列将是独一无二的,并且可能永远不会在全人类中再次出现。事实上,安排52张牌的潜在方法数量之多是难以想象的,以至于任何两张牌碰巧是同一张牌的可能性几乎为零


在这个例子中,有40个洗牌组,并希望确定它们都是独一无二的,这不是不可能的,其中两个是相同的,但如果你能够每10秒洗牌一次所有的牌组,并且你从宇宙诞生时就开始洗牌,那么这种情况很可能不会发生。

如果我们都继续在这个网站上捣乱重新加载按钮,那么可能不会发生:我把我所有的错误都归咎于GUID冲突。总有一天会发生的,对吧?很有可能是一条有着可爱格子图案色彩的鲨鱼从天而降,把你的电脑砸成碎片,所以我认为,作为你整体风险降低计划的一部分,采取预防措施是更合适的资源分配。@mipadi:很好的链接!我可以想象某个开发者