C# 不同计算机上的Guid唯一性

C# 不同计算机上的Guid唯一性,c#,sql-server,programming-languages,operating-system,guid,C#,Sql Server,Programming Languages,Operating System,Guid,可能重复: 在阅读了所有关于Guid的帖子之后,我仍然不清楚一件简单的事情: 不同机器生成的guid也保持其唯一性 我已经读过关于单台机器上guid唯一性的内容,但我仍然不知道不同机器的唯一性人们普遍认为新的随机guid总是唯一的。很可能这不是真的,但产生重复的可能性很小,我们不需要关心它。 生成两个相同GUI的几率为1:5316911983139663491615222824112400000 因此,如果在100万台计算机上生成100万个guid,则生成重复guid的几率为:1/531691

可能重复:

在阅读了所有关于Guid的帖子之后,我仍然不清楚一件简单的事情:

不同机器生成的guid也保持其唯一性


我已经读过关于单台机器上guid唯一性的内容,但我仍然不知道不同机器的唯一性

人们普遍认为新的随机guid总是唯一的。很可能这不是真的,但产生重复的可能性很小,我们不需要关心它。

生成两个相同GUI的几率为1:5316911983139663491615222824112400000

因此,如果在100万台计算机上生成100万个guid,则生成重复guid的几率为:1/5316911983139663491615228

以10亿台计算机上的10亿个GUI为例,生成重复的几率为: 5316911983139663491中有1个(相当于530亿分之一)

数字本身就说明了问题,你不会产生一个骗局

如果您想知道我从哪里得到这些数字,GUID的值部分是122位。2^122是5.31691198313966349161522282411214 x 10^36

一些更疯狂的数字…
如果每秒生成100万个guid,则可能需要168486464147580370470736年才能保证重复

@viggity提到,一些GUI的mac地址占用48位,数字仍然惊人,因此丢失这些位的成本是可以承受的。以上述每秒200万个guid(在同一台计算机上)为例,仍然需要598584166年才能保证重复。那是6亿年。这比地球上存在的生命还要长。或者,如果你是一个年轻的地球创世论者,那至少是地球寿命的6万倍。

GUID“几乎”都是独一无二的

GUID是一个128位整数(16字节),可以在需要唯一标识符的所有计算机和网络中使用。这样的标识符被复制的概率非常低


我记得在某处听说,如果你把IPV4地址空间(32位)想象成邮票的大小,IPV6(128位)就是我们太阳系的大小。生成一个复制品是不会发生的

此外,如果有任何问题,您更可能在同一台机器上获得一个副本,而不是两台不同的机器,因为大多数Guid生成算法将在Guid中嵌入计算机的NIC MAC地址(它是48位)。虽然有些算法没有嵌入MAC地址,只是纯粹随机的。见:

编辑:另一个有趣的比例例子 地球的体积大约为10^27立方厘米。这意味着地球体积的每立方厘米都有34000000个吉德。这个数字大得令人难以置信


或者,地球表面的每平方纳米都可能有大约650000个图形

“通用”意味着“不同的机器”,因为所有机器都是“通用”的一部分,但两个系统如何管理它必须创建不同的guid。guid生成器如何工作?它如何每次都创建唯一的guid?请阅读维基百科。不要相信这些数字。我已经在JS、PHP、Ruby和几个分布式DBMS中测试了GuidV4随机数,并在几千到几百万次测试中发现了许多冲突。始终测试唯一性。另请参见:但两个系统如何管理它必须创建不同的guid..guid生成器如何工作?它如何每次创建唯一的guid?它们是随机的。有如此多的随机组合,我们只是“相信”它将是唯一的。除非您使用的是顺序GUID:),否则您不会活到看到重复的时间。请使用1到100之间的随机数。下次再来一次。你第二次得到相同数字的几率是百分之一。现在取一个介于1和5316911983139663491615222824112400000之间的随机数。该数字没有名称。@flem-或提供GUID的RND生成器有缺陷。根据UUID规范,它还取决于GUID类型。为了补充讨论,维基百科条目中有一段关于GUID的引语:“一些有缺陷的GUID生成实现依赖于伪随机数生成器,这些生成器使用随机数种子源,这些种子源是可预测的”。因此,数学上有2^122个可能值(保留6位以表示随机GUID),但实际上,它可能会受到RND函数的限制。+1为了让我大吃一惊,可能会偏离主题,创造论者可能会使用14位GUID,可能会无视122位GUID,声称它代表了一个大于地球年龄的数字,因此是不真实的。@Wimbo-有争议的!:)-1表示错误概率,完全忽略4/5 UUID生成方案。由于生日问题,复制的几率实际上大大高于你的数字。现在,有122个随机比特,10亿仍然不足以使碰撞成为可能。但根据生成的类型、生成速度以及使用的不同机器的数量,根据鸽子洞原理,概率为1。一些UUID包括时间戳、MAC地址、“域ID”和其他值,这些值在较长时间内或给定计算机上肯定不是唯一的。>大多数Guid生成算法都会将计算机的NIC MAC地址嵌入Guid(48位)哇,这太傻了。为了那件事扯掉48位?有什么理由这样做吗?显示CCCC-CCCC-CCCC-CCCC-CCCC是有效的guid@vbullinger是的,这是有原因的,这样即使GUID的其余部分是相同的(它使用了时间戳,所以想法是两台机器可能会尝试同时创建GUID),也不会发生冲突。然而,这样的guid已经过时了;这些天来,这是更多的合作