GUID是100%独一无二的吗?
GUID是100%独一无二的吗?
它会保持独特的多个线程?
尽pipe每个生成的GUID不能保证是唯一的,但是唯一键(2 ^ 128或3.4×10 ^ 38)的总数非常大,以致相同数字两次产生的概率非常小。 例如,考虑包含5×10 ^ 22星的可观测宇宙; 每颗恒星可以拥有6.8×10 ^ 15个通用唯一GUID。
从维基百科 。
这些是关于如何使用GUID(.NET)的一些很好的文章,以及如何在正确的情况下获得相同的GUID。
http://ericlippert.com/2012/04/24/guid-guide-part-one/
简单的答案是肯定的。
Raymond Chen写了一篇关于GUID的好文章 ,以及为什么GUID的子串不保证是唯一的。 本文将深入讨论GUID生成的方式以及它们用来确保唯一性的数据,这应该花费一些时间来解释为什么它们是:-)
作为一个侧面说明,我正在玩Windows XP中的卷GUID。 这是一个非常模糊的分区布局,有三个磁盘和十四卷。
\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:) \\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:) \\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:) \\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:) \\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:) \\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:) \\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:) \\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:) \\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:) \\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:) \\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:) \\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:) \\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:) | | | | | | | | | +-- 6f = o | | | +---- 69 = i | | +------ 72 = r | +-------- 61 = a +---------- 6d = m
这不是说GUID非常相似,而是所有GUID都有string“mario”。 这是巧合吗?还是有这个背后的解释?
现在,当在GUID的第4部分使用googlesearch时,我发现有大约125.000个点击量的GUID。
结论:说到卷GUID,它们不像其他GUID那样唯一。
如果您害怕相同的GUID值,则将其中两个相邻。
Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
如果你太偏执,那就把三个。
是的,GUID应该始终是唯一的。 这是基于硬件和时间,再加上一些额外的比特,以确保它是唯一的。 我相信在理论上可能会得到两个相同的,但在现实世界中极不可能。
这是雷蒙德在Guids上的一篇很棒的文章:
http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
它不应该发生。 但是,当.NET负载较重时,可能会得到重复的GUID。 我有两个不同的Web服务器使用两个不同的SQL服务器。 我去合并数据,发现我有一千五百万的指导和七个重复。
Guids统计独特。 产生相同Guid的两个不同客户机的几率非常小(假定Guid生成代码中没有错误)。 你可能担心你的处理器因为宇宙射线而发生故障,并且决定今天2 + 2 = 5。
多个线程分配新的GUID将获得唯一的值,但你应该得到你所调用的函数是线程安全的。 这是哪个环境?
Eric Lippert写了一篇关于GUID的非常有趣的系列文章。
世界上有二三十台个人电脑(当然还有很多手持设备或非电脑计算设备的计算能力差不多,但是可以忽略这些)。 假设我们把世界上所有的PC都放到了生成GUID的任务上, 如果每个人每秒能够产生2 20个 GUID,那么只需要大约2 72秒 – 一万五千亿年之后 ,您就有很高的机会与您的特定GUID产生冲突。 只有三十万亿年之后,碰撞的几率才会相当不错。
- GUID指南,第一部分
- GUID指南,第二部分
- GUID指南,第三部分
理论上,不,他们不是唯一的。 一遍又一遍地生成一个相同的GUID是可能的。 但是,发生的可能性非常低,您可以认为它们是独一无二的。
我以前读过这个机会太低,你真的应该强调别的东西 – 比如你的服务器自发燃烧或者你的代码中的其他错误。 也就是说,假设它是唯一的,并不build立任何代码来“捕捉”重复的东西 – 把你的时间花在更可能发生的事情上(也就是其他事情)。
我试图描述GUID对我的博客观众(非技术性家庭成员)的有用性。 从那里(通过维基百科),生成一个重复的GUID的几率:
- 1在2 ^ 128
- 1 340令吉(不要担心,十万不是在测验)
- 1 3.4×10 ^ 38
- 1在340,000,000,000,000,000,000,000,000,000,000,000,000
从http://www.guidgenerator.com/online-guid-generator.aspx
什么是GUID?
GUID(或UUID)是“全局唯一标识符”(或“通用唯一标识符”)的首字母缩写词。 这是一个128位的整数,用于识别资源。 术语GUID通常由使用Microsoft技术的开发人员使用,而UUID在其他地方使用。
GUID有多独特?
128位足够大,生成algorithm足够独特,以至于如果每年产生1,000,000,000个GUID,一年的复制概率仅为50%。 或者,如果地球上的每个人产生了600,000,000个GUID,则只有50%的可能性是重复的。
如果您的系统时钟设置正确并且没有被缠绕,并且您的网卡有自己的MAC(即您没有设置自定义MAC),并且您的NIC供应商没有回收MAC(它们不应该这样做)但已知会发生),并且如果您的系统的GUID生成函数已正确实现,那么您的系统将永远不会生成重复的GUID。
如果地球上每个正在生成GUID的人遵循这些规则,那么您的GUID将是全球唯一的。
在实践中,违反规则的人数很less,他们的GUID不可能“逃脱”。 冲突在统计上是不可能的。
似乎没有提到它发生的可能性的实际math。
首先,我们假设我们可以使用整个128位空间(Guid v4只使用122位)。
我们知道在n
select中不重复的一般概率是:
(1-1 / 2 128 )(1-2 / 2 128 )…(1-(n-1)/ 2 128 )
因为2 128比n
大得多,所以我们可以将其近似为:
(1-1 / 2 128 ) n(n-1)/ 2
而且因为我们可以假设n
比0大得多,我们可以近似为:
(1-1 / 2 128 ) n ^ 2/2
现在我们可以把它等同于“可接受的”概率,比如说1%:
(1-1 / 2 128 ) n ^ 2/2 = 0.01
我们解决n
并得到:
n = sqrt(2 * log 0.01 / log(1-1 / 2 128 ))
哪个Wolfram Alpha变成5.598318×10 19
为了把这个数字放在一个angular度来看,让我们拿10000个机器,每个机器有一个4核心的CPU,做4Ghz,花费10000个周期来产生一个Guid,别无其他。 这将需要大约111年才能生成一个副本。
MSDN :
新Guid的值全部为零或等于任何其他Guid的可能性非常低。
GUID是100%独一无二的吗?
不能保证,因为有几种方法来生成一个。 但是,您可以尝试计算创build两个完全相同的GUID的机会,您可以得到这样的想法:一个GUID有128位,因此有2 128个不同的GUID– 远远超过已知Universe中的星星。 阅读维基百科的文章了解更多详情。
我遇到了一个重复的GUID。
我使用Neat Receipts桌面扫描仪,并附带专有的数据库软件。 该软件具有同步到云function,并且在同步时不断收到错误。 在日志上的甘德揭示了真棒:
“错误”:[{“code”:1,“message”:“creator_guid:has taken”,“guid”:“C83E5734-D77A-4B09-B8C1-9623CAC7B167”}]}
我有点不相信,但是当我发现一种方式到我的本地neatworks数据库并删除包含该GUID的logging,错误停止发生。
所以用轶事证据回答你的问题,不。 重复是可能的。 但是,它发生的原因很可能不是偶然的,而是由于标准的做法没有得到某种程度的遵守。 (我只是不那么幸运)但是,我不能肯定地说。 这不是我的软件。
他们的客户支持是非常有礼貌和乐于助人的,但他们之前一定没有遇到过这个问题,因为3个多小时的电话跟他们在一起,他们没有find解决办法。 (FWIW,Neat给我留下了深刻的印象,这个令人沮丧的小故障并没有改变我对他们产品的看法。)
GUIDalgorithm通常是根据v4 GUID规范来实现的,它本质上是一个伪随机string。 不幸的是,这些属于维基百科的“可能非独特”类别(我不知道为什么很多人忽略了这一点):“…其他的GUID版本有不同的唯一性和概率,从保证的唯一性可能非唯一性“。
V8的JavaScript Math.random()
的伪随机属性在唯一性上是可怕的,在经过几千次迭代后碰撞经常出现,但V8并不是唯一的罪魁祸首。 我已经看到使用PHP和Ruby的v4 GUID实现的真实世界的GUID冲突。
因为在多个客户端和服务器集群中扩展ID生成变得越来越普遍,所以熵受到了很大的冲击 – 相同的随机种子被用来生成ID升级的机会(时间通常被用作随机种子在伪随机发生器中),并且GUID冲突从“可能的非唯一性”升级为“很可能造成许多麻烦”。
为了解决这个问题,我开始着手创build一个可以安全扩展的IDalgorithm,并且更好地防止碰撞。 这是通过使用时间戳,内存中的客户端计数器,客户端指纹和随机字符。 这些因素的组合产生了一种添加复杂性,特别是可以抵抗碰撞,即使您将其扩展到多个主机上:
在multithreading/多进程unit testing中,我遇到过GUID不唯一(也是?)。 我想这与其他所有的情况是相同的,伪随机发生器的同种(或缺less播种)。 我正在使用它来生成唯一的文件名。 我发现操作系统在这方面做得更好:)
拖动警报
你问如果GUID是100%独特的。 这取决于其中必须唯一的GUID的数量。 随着GUID的数量接近无穷大,重复GUID的概率接近100%。
从更一般的意义上讲,这被称为“生日问题”或“生日悖论”。 维基百科有一个很好的概述: 维基百科 – 生日问题
在非常粗略的情况下,池的大小的平方根是一个粗略的近似值,当你可以预期有50%的重复机会。 该文章包括一个池大小和各种概率的概率表,其中包括一个2 ^ 128的行。 所以如果有1%的碰撞概率,你可以随机select2.6 * 10 ^ 18的128位数字。 50%的机会需要2.2 * 10 ^ 19的select,而SQRT(2 ^ 128)是1.8 * 10 ^ 19。
当然,这只是一个真正的随机过程的理想情况。 正如其他人提到的,很多东西是随机的 – 发电机和种子有多好? 如果有一些硬件支持来协助这个过程,除了可以欺骗或虚拟化外,这将是更好的防范措施。 我怀疑这可能是MAC地址/时间戳不再被合并的原因。