一个GUID是否总是唯一的?

668

GUID是否100%独一无二?

在多个线程上,它是否仍然保持独一无二?


331
不,不是100%...只有99.999999999999999999999999999999999999999999999999999999999999999999999999999999%;) - JohannesH
66
首先,GUID并不是无限的,这意味着字面上的“100%时间”的意思是,无论您生成多长时间的GUID,它们总是唯一的。但事实并非如此。由于原始实现中使用网络卡唯一的序列号/ID/MAC来产生密钥的方法已不再使用,因此GUID现在不再全球唯一。但它仍然是本地唯一的。换句话说,如果您在单台机器上不断生成GUID,则不会出现重复。 - Lasse V. Karlsen
37
@ojrac 我只是选择向下取整... :P - JohannesH
531
每次我生成GUID时,都感觉自己从宇宙中窃取了一个。有时我会想到那些生成比他们需要更多GUID的邪恶人,那些被浪费掉的GUID是如此孤独,无法再次被使用或生成...... - asavartsov
63
@asavartsov 我认为你会喜欢这个网站:http://www.wasteaguid.info/ ^_^ - Navin
显示剩余16条评论
25个回答

2

为了获得更好的结果,最好的方法是将GUID与时间戳相结合(只是为了确保它保持唯一性)。

Guid.NewGuid().ToString() + DateTime.Now.ToString();

如果在同一秒钟内发生两个碰撞会怎么样呢? - Wai Ha Lee
这是最坏的情况,但我们仍然不能在同一时间生成相同的两个Guid。 - Adithya Sai
有人争论说,应该从SO上的回答中复制,而不是问题,但是现在我并不确定... - Marcel
1
Guid.NewGuid().ToString().Replace("-", "") + DateTime.Now.Ticks 这个怎么样?它的唯一性是毋庸置疑的,可以用作主键。 - d-coder

0

最困难的部分不是生成重复的Guid。

最困难的部分是设计数据库来存储所有已生成的Guid,以检查它是否实际上是重复的。

来自维基百科:

例如,需要生成多少个随机版本4的UUID才能使至少有一个冲突的50%概率为2.71十万亿,如下所示:

enter image description here

这个数字相当于每秒生成10亿个UUID,需要大约85年。包含这么多UUID的文件,每个UUID占16个字节,约为45艾字节,比当前已经存在的最大数据库大得多,后者的数量级是几百个拍字节。


0

GUID代表全局唯一标识符

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

详细说明: GUID旨在保持唯一性;它们使用基于计算机时钟和计算机本身的随机方法进行计算,如果您在同一毫秒内在同一台机器上创建许多GUID,则可能会匹配,但对于几乎所有正常操作,它们应被视为唯一。


-1
如此之低,几乎接近于零,但永远不会是零。问我怎么知道... 我实际上来这里是为了弄清楚它到底有多不可能,因为我刚刚发现在我的一个数据库中有两个数据片段共享相同的GUID...

请不要重复现有的答案。 - undefined

-2

有足够的 GUID 可以分配到每一个假设星系所有假设星球上每一粒沙子。

足够多,以至于如果全世界的计算机每秒生成 1000 个 GUID ,并持续 200 年,可能(可能)会发生碰撞。

考虑到 GUID 的当前本地使用数量(例如每个数据库表的一个序列),它对我们这些有限的生物(以及那些寿命通常不到十年甚至一两年的移动电话等机器)几乎永远不可能成为问题。

... 我们现在可以关闭此线程了吗?


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