GUID是否100%独一无二?
在多个线程上,它是否仍然保持独一无二?
GUID是否100%独一无二?
在多个线程上,它是否仍然保持独一无二?
资料来源:维基百科
以下是一些关于如何生成GUID(针对.NET)以及在正确情况下如何获得同一个guid的好文章。
https://ericlippert.com/2012/04/24/guid-guide-part-one/
2^128
的值是多少,它大约等于:34,028,236,692,093,846,346,337,460,743,177,000,000
。统计学上来说,如果每秒计算1000个GUID,要产生重复的概率需要经过数万亿年才可能发生。 - Entity如果您害怕相同的GUID值,那么请将它们放在一起。
Guid.NewGuid().ToString() + Guid.NewGuid().ToString();
如果你过于多疑,那就加三个。
\\?\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部分,我发现大约有125,000个与卷GUID相关的搜索结果。
结论:当涉及卷GUID时,它们并不像其他GUID那样独特。
这不应该发生。然而,当 .NET 承受重负时,可能会出现重复的 GUID。我有两个使用不同 SQL 服务器的网络服务器。我试图合并数据,结果发现 1500 万个 GUID 中居然有 7 个重复。
Guid.NewGuid
始终生成 v4 GUID(一直如此)。Tim 可能使用了非常糟糕的熵源。 - Stephen Cleary是的,GUID应该始终保持唯一性。它基于硬件和时间,再加上一些额外的位来确保其唯一性。理论上可能会出现两个相同的情况,但在实际情况下极不可能发生。
这是 Raymond Chen 写的一篇关于 GUID 的好文章:
https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
Guid(全局唯一标识符)是在统计学上唯一的。假设Guid生成代码没有bug,两个不同客户端生成相同的Guid的概率非常小,就像担心你的处理器因宇宙射线而出现故障,今天决定2+2=5一样。
多个线程分配新的Guid将获得唯一值,但您应该确保调用的函数是线程安全的。这是在哪个环境中?
Eric Lippert写了一系列关于GUID的非常有趣的文章。
世界上大约有230台个人电脑(当然还有很多手持设备或非PC计算设备,具有更多或更少相同的计算能力,但让我们忽略这些)。假设我们将全世界所有的PC用于生成GUID;如果每台PC每秒可以生成220个GUID,则仅需大约272秒(一千五百万亿年)--就会有一个非常高的机会生成与您特定GUID相冲突的GUID。并且在三万亿年后,发生碰撞的概率就相当大了。
似乎没有人提及这种情况发生的实际数学概率。
首先,假设我们可以使用整个128位空间(Guid v4仅使用122位)。
我们知道在选取中未重复的一般概率为:
(1-1/2128)(1-2/2128)...(1-(n-1)/2128)
由于2128远远大于n
,因此我们可以将其近似为:
(1-1/2128)n(n-1)/2
因为我们可以假设n
远远大于0,所以我们可以将其近似为:
(1-1/2128)n^2/2
现在我们可以将其等同于“可接受”的概率,假设为1%:
(1-1/2128)n^2/2 = 0.01
我们解出n
并得到:
n = sqrt(2* log 0.01 / log (1-1/2128))
Wolfram Alpha计算得到的结果是 5.598318 × 10 19
为了说明这个数字,假设有10000台机器,每台机器都有一个4核CPU,时钟频率为4Ghz,并花费10000个周期来生成Guid并什么也不做。那么它们需要大约111年才能生成重复的Guid。