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空间难以理解.我对此很敬畏.)
Mec*_*ail 38
简短的回答:出于实际目的,是的.
但是,你必须考虑生日悖论!
我已经计算了一些有代表性的碰撞概率.使用维基百科文章中指定的122位UUID,如果生成至少2.71492e18
UUID ,则冲突概率为1/2 .使用10 ^ 19个UUID,概率为0.999918.使用10 ^ 17个UUID,0.000939953.
可以在维基百科上找到一些用于比较的数字.因此,您可以安全地为每个生活过的人,可观察宇宙中的每个星系,海洋中的每条鱼以及地球上的每只蚂蚁分配UUID.然而,如果你为一年内人类产生的每个晶体管,地球上的每个昆虫,地球上的每粒沙子,可观察宇宙中的每颗恒星或任何更大的物体产生UUID,那么碰撞几乎可以肯定.
如果每秒产生10亿UUID,则需要大约36年才能获得10%的碰撞概率.
最终,在人类历史进程中产生的UUID集之间可能会发生冲突.碰撞的UUID用于同一目的的概率仍然很小,因此在实践中没有问题.
维基百科上提供了碰撞可能性的分析:http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates
如链接中所述,这将受随机数生成器的属性影响.
GUID生成器代码中也可能存在错误; 虽然机会很低,但它们可能高于基于数学的碰撞机会.
Bloom过滤器可能是合适的; 它可以快速告诉您GUID是否是唯一的,但是有可能错误地指示碰撞.如果您一次测试批次,则另一种方法是对批次进行排序并比较每个连续的元素.
一般来说,是的,可以安全地假设.
如果您的GUID生成器是真正随机的,则1000 GUID内发生冲突的可能性非常小.
当然,这假定一个好的GUID生成器.所以问题是你真的相信你用来生成GUID的工具有多少,它有自己的测试吗?
归档时间: |
|
查看次数: |
42538 次 |
最近记录: |