GUID 100%是唯一的吗?

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


当前回答

在多线程/多进程单元测试期间,我经历过guid不是唯一的(也是?)我想这与所有其他条件相同的情况下,伪随机生成器的相同播种(或缺乏播种)有关。我用它来生成唯一的文件名。我发现操作系统在这方面做得更好:)

恶意破坏预警

你问guid是否100%唯一。这取决于它在guid中必须是唯一的。当guid的数量接近无穷大时,重复guid的概率接近100%。

其他回答

似乎没有人提到它发生概率的实际数学计算。

首先,让我们假设我们可以使用整个128位空间(Guid v4只使用122位)。

我们知道在n次选择中没有得到重复的一般概率是:

(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 = 0.01

我们解出n,得到

N =√(2* log 0.01 / log (1-1/2128))

哪个Wolfram Alpha得到5.598318 × 1019

为了更好地理解这个数字,让我们以10000台机器为例,每台机器都有一个4核CPU,工作4Ghz,花费10000个周期来生成一个Guid,其他什么都不做。然后需要大约111年才能产生一个副本。

从统计上看,向导是独一无二的。两个不同的客户端生成相同Guid的几率非常小(假设Guid生成代码中没有错误)。你也可以担心由于宇宙射线导致的处理器故障,并决定今天2+2=5。

分配新guid的多个线程将获得唯一的值,但您应该知道您正在调用的函数是线程安全的。这是在哪个环境中?

GUID 100%是唯一的吗?

不能保证,因为有几种方法可以生成一个。然而,您可以尝试计算创建两个完全相同的GUID的几率,您就会明白:一个GUID有128位,因此,有2128个不同的GUID——比已知宇宙中的恒星要多得多。阅读维基百科的文章了解更多细节。

MSDN:

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

理论上讲,不,它们不是唯一的。可以反复生成相同的guid。然而,这种情况发生的几率非常低,你可以假设它们是独一无二的。

我以前读到过,这种可能性非常低,你真的应该关注其他事情——比如你的服务器自燃或代码中的其他错误。也就是说,假设它是唯一的,不要构建任何“捕获”重复的代码——把时间花在更有可能发生的事情上(即任何其他事情)。

我尝试向我的博客读者(非技术家庭成员)描述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,000,000