GUID是否在100%的时间内是唯一的?

时间:2020-03-05 18:46:31  来源:igfitidea点击:

GUID是否在100%的时间内是唯一的?

它会在多个线程上保持唯一性吗?

解决方案

回答

While each generated GUID is not
  guaranteed to be unique, the total
  number of unique keys (2^128 or
  3.4×10^38) is so large that the probability of the same number being
  generated twice is very small. For
  example, consider the observable
  universe, which contains about 5×10^22
  stars; every star could then have
  6.8×10^15 universally unique GUIDs.

来自维基百科。

这些是有关如何制作GUID(用于.NET)以及如何在正确的情况下获得相同GUID的不错的文章。

http://ericlippert.com/2012/04/24/guid-guide-part-one/

http://ericlippert.com/2012/04/30/guid-guide-part-two/

http://ericlippert.com/2012/05/07/guid-guide-part-three/

回答

是的,GUID应该始终是唯一的。它基于硬件和时间,再加上一些额外的比特以确保其唯一性。我相信从理论上讲,最终可以得到两个相同的对象,但是在现实世界中是极不可能的。

这是雷蒙德·陈(Raymond Chen)在Guids上发表的一篇精彩文章:

http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

回答

简单的答案是肯定的。

Raymond Chen在GUID上写了一篇很棒的文章,以及为什么不能保证GUID的子字符串是唯一的。本文深入探讨了GUID的生成方式以及它们用于确保唯一性的数据,这在解释它们为什么如此时应做一些工作:-)

回答

MSDN:

There is a very low probability that the value of the new Guid is all zeroes or equal to any other Guid.

回答

Is a GUID unique 100% of the time?

不能保证,因为有多种生成方法。但是,我们可以尝试计算创建两个相同的GUID的机会,然后我们就会明白:一个GUID具有128位,因此,有2128个不同的GUID远远超过已知宇宙中的恒星。阅读Wikipedia文章以了解更多详细信息。

回答

指导在统计上是唯一的。生成相同Guid的两个不同客户端的几率非常小(假设Guid生成代码中没有错误)。我们还可能担心由于宇宙射线而导致处理器故障,并决定今天2 + 2 = 5.

分配新的Guid的多个线程将获得唯一的值,但是我们应该确保所调用的函数是线程安全的。这是什么环境?

回答

从理论上讲,不,它们不是唯一的。可能一遍又一遍地生成相同的GUID。但是,发生这种情况的机会非常低,我们可以认为它们是独一无二的。

我之前读过这篇文章,机会很少,我们真的应该强调其他事情-例如服务器自燃或者代码中的其他错误。也就是说,假设它是唯一的,并且没有内置任何代码来"捕获"重复项-将时间花在更可能发生的事情上(即其他任何事情)。

我试图向我的博客读者(非技术家庭成员)描述GUID的有用性。从那里(通过Wikipedia),生成重复GUID的几率:

  • 1分2 ^ 128
  • 340十亿分之一(不要担心,十亿不在测验中)
  • 1的3.4 10 ^ 38
  • 340,000,000,000,000,000,000,000,000,000,000,000,000中的1

回答

如果系统时钟设置正确并且没有缠绕,并且NIC有自己的MAC(即我们尚未设置自定义MAC),并且NIC供应商尚未回收MAC(它们不应该这样做)但已知已发生),并且如果系统的GUID生成功能已正确实现,则系统将永远不会生成重复的GUID。

如果地球上每个生成GUID的人都遵循这些规则,那么GUID将在全球范围内是唯一的。

实际上,违反规则的人数很少,其GUID不太可能"逃脱"。冲突在统计上是不可能的。

回答

附带说明一下,我正在使用Windows XP中的Volume 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中都包含字符串" mario"的事实。这是巧合还是背后有解释?

现在,当在GUID中搜索第4部分时,我发现批量GUID的点击量约为125.000。

结论:关于卷GUID,它们不像其他GUID那样独特。

回答

这不应该发生。但是,当.NET负担很重时,就有可能获得重复的引导。我有两个使用两个不同sql服务器的不同Web服务器。我去合并数据,发现我有1500万盾和7个副本。