一个GUID是否总是唯一的?

668

GUID是否100%独一无二?

在多个线程上,它是否仍然保持独一无二?


331
不,不是100%...只有99.999999999999999999999999999999999999999999999999999999999999999999999999999999%;) - JohannesH
66
首先,GUID并不是无限的,这意味着字面上的“100%时间”的意思是,无论您生成多长时间的GUID,它们总是唯一的。但事实并非如此。由于原始实现中使用网络卡唯一的序列号/ID/MAC来产生密钥的方法已不再使用,因此GUID现在不再全球唯一。但它仍然是本地唯一的。换句话说,如果您在单台机器上不断生成GUID,则不会出现重复。 - Lasse V. Karlsen
37
@ojrac 我只是选择向下取整... :P - JohannesH
531
每次我生成GUID时,都感觉自己从宇宙中窃取了一个。有时我会想到那些生成比他们需要更多GUID的邪恶人,那些被浪费掉的GUID是如此孤独,无法再次被使用或生成...... - asavartsov
63
@asavartsov 我认为你会喜欢这个网站:http://www.wasteaguid.info/ ^_^ - Navin
显示剩余16条评论
25个回答

10

来自http://www.guidgenerator.com/online-guid-generator.aspx

什么是GUID?

GUID(或UUID)是“全局唯一标识符”(或“通用唯一标识符”的缩写)。它是一个128位的整数,用于标识资源。该术语通常由使用Microsoft技术的开发人员使用,而UUID则在其他地方使用。

GUID有多独特?

128位足够大,生成算法足够独特,如果每秒生成1,000,000,000个GUID并持续1年,则重复的概率仅为50%。或者,如果地球上的每个人都生成600,000,000个GUID,则只有50%的概率会出现重复。


13
一个50%的重复概率不足以引起恐惧吗? - disklosr
5
@disklosr 嗯,如果你的系统每秒生成10亿个GUID,则足以引起恐惧。在极不可能发生的情况下,如果你正在产生如此大量的GUID,则只需将两个GUID连接在一起即可。 - maxshuty

9

GUID是否总是唯一的?

不能保证,因为有几种生成方式。但是,您可以尝试计算创建两个相同的GUID的机会,并且您会得到一个概念:GUID具有128位,因此有2128个不同的GUID——比已知宇宙中的星星数量还要多得多。阅读wikipedia article以获取更多详细信息。


7

我遇到了一个重复的GUID。

我使用Neat Receipts桌面扫描仪,并附带专有的数据库软件。该软件有一个云同步功能,但在同步时我一直收到错误提示。查看日志后,我发现了这个惊人的错误信息:

"errors":[{"code":1,"message":"creator_guid: is already taken","guid":"C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]}

我有点难以置信,但当我找到进入我的本地neatworks数据库并删除包含该GUID的记录时,错误就不再出现了。

所以根据我的经验来回答你的问题,是的,重复的GUID是可能存在的。但很可能之所以发生这种情况,是因为某些标准实践没有得到遵守。 (我只是没有那么幸运)然而,我不能确定。这不是我的软件。

他们的客户支持非常有礼貌和乐于助人,但他们似乎从未遇到过这个问题,因为在与他们通电话3个多小时后,他们没有找到解决方案。(顺便说一下,我对Neat印象非常好,这个故障虽然令人沮丧,但并没有改变我对他们产品的看法。)


26
不要相信你得到了一个重复的唯一标识符。可能涉及其他因素,比如数字不是真正随机的,同步过程中出现问题,或系统尝试记录两次等等。软件问题比你得到重复GUID的可能性要大得多。 - orad

7

MSDN:

新 Guid 的值全为零或等于其他任何 Guid 的概率非常低。


6
如果您的系统时钟已正确设置且未发生回绕,如果您的网卡具有自己的MAC地址(即您未设置自定义MAC地址),并且您的网卡供应商未回收MAC地址(虽然他们不应该这样做,但已知会发生),并且您的系统GUID生成函数已正确实现,则您的系统将永远不会生成重复的GUID。
如果地球上每个生成GUID的人都遵循这些规则,则您的GUID将是全球唯一的。
实际上,违反规则的人数很少,他们的GUID不太可能“逃脱”。冲突的概率极低。

12
这仅适用于版本1的GUID。而版本4已成为事实上的标准,不再使用Mac地址而是使用伪随机数。 - Pita.O
1
即使按照您所说的v1 GUID的所有规则,您的系统仍可能生成重复的GUID。当您在底部声明“冲突是统计上不太可能的”时,您更加正确。因此,如果您遵循了适当的实现方法,那么您的系统将永远不会生成重复的GUID。 - Nick Meldrum

3

我认为当人们将他们的想法和恐惧埋在统计数据中时,他们往往会忘记显而易见的事情。如果一个系统是真正随机的,那么你最不可能预期到的结果(比如全是1)与任何其他意外值(比如全是0)一样可能发生。这两个事实都不能阻止它们相继发生,甚至在前两个样本之内(尽管在统计上这将是“真正令人震惊”的)。这就是测量概率的问题所在:它完全忽略了关键性(和糟糕的运气)。

如果真的发生了什么,后果会是什么?你的软件会停止工作吗?有人会受伤吗?有人会死亡吗?世界会爆炸吗?

关键性越极端,"概率"这个词就越难以启齿。最后,当您认为(主观上)您的特定关键性(和您的“幸运感”)是不可接受时,链接GUID(或对它们进行XOR操作,或其他操作)就是您所做的事情。如果它可能导致世界末日,那么请代表我们所有不参与大型强子对撞机核实验的人,不要使用GUID或任何其他不确定的东西!


3
GUID算法通常按照v4 GUID规范实现,这是一种伪随机字符串。遗憾的是,这些属于“可能不唯一”的类别,来自维基百科(我不知道为什么有这么多人忽略这一点):“...其他GUID版本具有不同的唯一性属性和概率,从保证唯一性到可能不唯一。”
V8的JavaScript Math.random()的伪随机属性在唯一性方面非常糟糕,往往只需要几千次迭代就会发生冲突,但V8并不是唯一的罪魁祸首。我曾经看到过使用PHP和Ruby实现v4 GUID的真实世界GUID冲突。
由于越来越普遍地将ID生成扩展到多个客户端和服务器集群,熵受到了很大的影响——使用相同的随机种子生成ID的机会增加了(时间通常用作伪随机生成器的随机种子),GUID冲突从“可能不唯一”升级为“很可能会造成大量麻烦”。
为了解决这个问题,我开始着手创建一个ID算法,能够安全地扩展,并提供更好的碰撞保证。它通过使用时间戳、内存客户端计数器、客户端指纹和随机字符来实现。这些因素的组合创造了一种加性复杂度,特别是在跨多个主机进行扩展时,具有很强的抗碰撞能力。

http://usecuid.org/


3

我遇到过在多线程/多进程单元测试中GUID不唯一的情况(也许是因为伪随机生成器的种子相同,或者没有种子)。我当时用它来生成唯一的文件名,但后来发现操作系统做得更好:)

挑衅警告

你问GUID是否100%唯一。这取决于GUID需要在多少个GUID中保持唯一。当GUID数量趋近无限时,重复GUID的概率趋近100%。


我也有过这样的经历,但如果我谈论它,就会被嘲笑 :D - Spikolynn

2

"GUID是否100%唯一?"的答案很简单:"不是"

  • 如果您想获得100%唯一的GUID,请执行以下操作:

    1. 生成GUID
    2. 检查该GUID是否存在于您正在寻找唯一性的表列中
    3. 如果存在,则返回步骤1,否则进入步骤4
    4. 使用此GUID作为唯一标识。

2
这并不使其具有唯一性。您的算法没有在表中保存新创建的GUID。下次创建GUID时,它可能会与之前的GUID发生冲突。如果您将GUID插入表中,则GUID可能已经被另一个对等方插入,此时在检查唯一性并将GUID插入表中之间。GUID仅在您的系统内是唯一的,因此,如果您要导入或合并两个数据库,它们仍然可能会发生冲突。此外,在无法访问集中式数据库时,通常使用GUID。如果您可以访问为什么不直接从数据库中拉取ID? - Jogge

2
以更广义的意义来说,这被称为“生日问题”或“生日悖论”。维基百科在以下链接中有一个相当好的概述: Wikipedia - 生日问题 粗略地说,池大小的平方根是你可以期望出现重复的50%几率的粗略近似值。该文章包括了一个池大小和各种概率的概率表,其中包括2 ^ 128行。因此,对于1%的碰撞概率,您需要随机选择2.6 * 10 ^ 18个128位数字。50%的几率需要2.2 * 10 ^ 19次选择,而SQRT(2 ^ 128)为1.8 * 10 ^ 19。
当然,这只是真正随机过程的理想情况。正如其他人提到的那样,很多事情都取决于那个“随机”的方面-生成器和种子的质量如何?如果有一些硬件支持来协助这个过程,那将更加牢固,但是任何东西都可以被欺骗或虚拟化。我怀疑这可能是MAC地址/时间戳不再被纳入的原因。

我认为 MAC 地址的问题在于匿名性。我认为使用可逆转的标识符(例如 MAC 地址)会涉及到隐私问题。我认为硬件真正的随机性非常困难?Cloudflare 使用摄像头和一排熔岩灯,但我认为即使有精确的物理学理解,它也不是完全随机的。Cloudflare 的熔岩灯 RNG: https://www.popularmechanics.com/technology/security/news/a28921/lava-lamp-security-cloudflare/ - Jeff Block

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接