GUID 100%是唯一的吗?

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


当前回答

GUID代表全局唯一标识符

简而言之: (线索就在名字里)

详细: guid被设计为唯一的;它们是使用基于计算机时钟和计算机本身的随机方法计算的,如果你在同一毫秒内在同一台机器上创建多个guid,它们可能是匹配的,但对于几乎所有的正常操作,它们应该被认为是唯一的。

其他回答

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

首先,让我们假设我们可以使用整个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。

我使用的是Neat收据桌面扫描仪,它自带专有数据库软件。该软件有一个同步到云的功能,我总是在同步时得到一个错误。浏览一下日志,你会发现这句话非常棒:

"errors":[{"code":1,"message":"creator_guid: is already . 了”、“guid”:“c83e5734 d77a - 4 - b09 b8c1 - 9623 cac7b167”}]}

我有点难以置信,但可以肯定的是,当我找到进入本地网络数据库的方法并删除包含该GUID的记录时,错误就停止了。

所以用轶事证据来回答你的问题,没有。副本是可能的。但它发生的原因很可能不是由于偶然,而是由于标准的做法在某种程度上没有得到遵守。(我只是没有那么幸运)然而,我不能肯定。这不是我的软件。

他们的客户支持非常有礼貌和乐于助人,但他们以前肯定从未遇到过这个问题,因为在与他们电话交谈3个多小时后,他们没有找到解决方案。(总之,Neat给我留下了深刻的印象,这个小故障虽然令人沮丧,但并没有改变我对他们产品的看法。)

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

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

“GUID是100%唯一的吗?”的答案是“不是”。

如果你想要GUID的100%唯一性,然后做下面的事情。 生成GUID 检查GUID是否存在于您正在寻找唯一性的表列中 如果存在,则转步骤1,否则转步骤4 使用这个GUID作为唯一的。

MSDN:

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