能否创建相同的GUID?

13

在一个应用程序中是否可能创建相同的GUID?

Guid id = Guid.NewGuid();

它可以帮助你... https://dev59.com/IXRB5IYBdhLWcg3w6bcE https://dev59.com/sHVC5IYBdhLWcg3wbQbA - Yuriy
请查看此问题/答案:https://dev59.com/607Sa4cB1Zd3GeqP2lEz。 - Uwe Keim
6个回答

16

从技术上来说,是的。一个创建的 GUID 看起来像这样:

26de36b7-76f5-4f17-8f9d-44eb429f151b

这意味着32个字符可以是字母(26种可能性)或数字(10种可能性)。

这意味着每个位置有36种可能性,总共有36^32种可能性,大约为60 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000。

这意味着如果您每毫秒创建2 000 000 000 000 000 000 000 000 000 000 000 000 000个Guid(这是不可能的),平均而言将会有一个GUID被重复创建两次,而其他所有的GUID都是唯一的。

因此,在实践中,是不会出现相同的GUID的 ;)


1
GUID不是用十六进制表示吗?如果是这样,你可选的字母不是26个,而是6个。 - Craig W.
@CraigW. - 那是一个很好的观点 :) 这意味着数学有些出入,但理论仍然相同:有16种可能性意味着可能的GUID总数为3.4e38,而不是6.33e49。仍然足够高,可以避免冲突。 - Øyvind Bråthen

12
如果你问的是Guid.NewGuid()创建重复guid的风险是否很高,那么答案是否定的。以下内容摘自维基百科
“GUID的值表示为32个字符的十六进制字符串,例如{21EC2020-3AEA-1069-A2DD-08002B30309D},通常存储为128位整数。唯一密钥的总数是2128或34×1038 - 大约是地球整体体积每立方毫米的2万亿倍。这个数字非常大,生成相同的数字的概率极小。”
如果你问我们如何创建两个重复的guid,那么答案是:
Guid g1 = new Guid("21EC2020-3AEA-1069-A2DD-08002B30309D");
Guid g2 = new Guid("21EC2020-3AEA-1069-A2DD-08002B30309D");

1

理论上?是的。

实际上?你在单个应用程序中创建两个相同的GUID的机会比连续赢得10次彩票还要小。

请参见GUID不唯一的简单证明


1
实际上,如果中奖的概率不是太糟糕的话,你可能每周赢得余生的彩票都更有机会;) - Øyvind Bråthen

0

Guid.NewGuid()会始终创建一个全球唯一的Guid,而不仅仅是在单个应用程序内部。


1
不再如此,请检查规范。至少,Windows使用GUID规范的V4版本,并且唯一部分已经减少到单个系统。虽然跨系统生成重复键的可能性很小,但仍有可能。 - Lasse V. Karlsen

-1
GUID中的U代表唯一(Unique)。;-) 因此,这是不可能的。


4
但这是有可能发生的,虽然不太可能。 - Lasse V. Karlsen

-2

我刚刚遇到了这个问题。我的数据库表中有7个项目。从我的程序中,我添加了一个新实例,使用Guid.NewGuid()作为其ID。我收到了一个DbUpdateException告诉我该ID与现有的某个ID相同。再试一次,它就可以正常工作了。


1
概率如此之小,以至于你看到冲突时,我会寻找错误/线程问题,而不是怀疑GUID算法本身-请参阅GUID算法的这篇文章 - chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接