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

Tom*_*age 112 math guid probability unique collision

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

奖金问题

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

Ant*_*sky 342

是的你可以.由于GUID长度为128位,因此肯定会有一分钟冲突的可能性 - 但"分钟"这个词远远不够强大.有如此多的GUID,如果你随机生成几万亿个GUID,你更有可能被陨石击中而不是甚至一次碰撞(来自维基百科).如果您不是随机生成它们,但是例如使用MAC地址和时间戳算法,那么它们也将是唯一的,因为MAC地址在计算机中是唯一的,并且时间戳在您的电脑.

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

那里有大量的GUID.引用道格拉斯亚当斯的银河系漫游指南:

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

而且由于宇宙大约有7×10 22颗恒星,并且刚好低于2 128个 GUID,因此每颗恒星大约有4.86×10 15个 - 几乎五千万亿颗-GUID.如果这些恒星中的每一个都拥有像我们这样繁荣的人口世界,那么在每一颗恒星周围,每一个曾经生活过的人类或外星人都有权获得超过四万五千个GUID.对于宇宙中每颗恒星的历史上的每个人.GUID空间与整个Universe的大小处于相同的巨大水平.你没有必要担心.

(编辑2:对此反思:哇.我没有意识到自己的意思.GUID空间难以理解.我对此很敬畏.)

  • 值得注意的是,如果GUID冲突位于同一业务空间中,那么它也只是一个问题.我用来识别软件中的组件的GUID可能与您在自己的应用程序中的数据库行中使用的GUID相同而不会导致任何问题 (12认同)
  • 尽管数字仍然很高,但GUID冲突的可能性在2 ^ 64 GUID时超过50%. (5认同)
  • 此外,WolframAlpha 报告说,对于曾经生活过的每个人的每个细胞,都有 36 万亿个 UUID。你的身体里有大约 10^14 个细胞,1065 亿人曾经生活过。或者,“2.385 * 10^23”UUID 代表美国公共债务中的每一分钱。 (2认同)
  • 事实上,有 2^128 个 GUIDS 是无关紧要的,并且在 50% 的碰撞概率下你并不“仍然擅长”,你甚至在 0.0000001% 的碰撞概率下也不擅长 (2认同)

Mec*_*ail 38

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

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

我已经计算了一些有代表性的碰撞概率.使用维基百科文章中指定的122位UUID,如果生成至少2.71492e18UUID ,则冲突概率为1/2 .使用10 ^ 19个UUID,概率为0.999918.使用10 ^ 17个UUID,0.000939953.

可以在维基百科上找到一些用于比较的数字.因此,您可以安全地为每个生活过的人,可观察宇宙中的每个星系,海洋中的每条鱼以及地球上的每只蚂蚁分配UUID.然而,如果你为一年内人类产生的每个晶体管,地球上的每个昆虫,地球上的每粒沙子,可观察宇宙中的每颗恒星或任何更大的物体产生UUID,那么碰撞几乎可以肯定.

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

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

  • 这就是宇宙结束的方式......一些程序员只是假设他们的GUID对于他们的巨型死星来说总是独一无二的...... (11认同)

Mar*_*som 8

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

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

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

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


Haa*_*ked 5

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

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

当然,这假定一个好的GUID生成器.所以问题是你真的相信你用来生成GUID的工具有多少,它有自己的测试吗?