使用Guids可以安全地创建多少个ID?

时间:2011-09-06 06:38:16

标签: .net statistics guid

我仍然无法理解Guid可以安全地用作唯一标识符的断言。维基百科页面说

  

键的总数...太大,以至于随机生成两次相同数字的概率可以忽略不计。

我的问题是,在概率变得不可忽视之前,我可以安全地生成多少个ID?我的意思是,必须有一个限制,正确(至多是鸽笼约束)?

如果Guid生成的实现各不相同,那就让我们假设.NET Guid。

4 个答案:

答案 0 :(得分:3)

我自己做了一次测试,经过一周和一个太字节的guid,仍然没有重复。

See here了解概率。

答案 1 :(得分:3)

严格来自维基百科Random UUID probability of duplicates

它描述了具有122个有意义位的java.util.UUID的冲突概率。 System.Guid虽然使用了所有128位,但本文将为您提供一些近似值。

  

换句话说,只有在接下来的100年中每秒产生10亿UUID之后,创建一个副本的概率大约为50%。如果地球上的每个人拥有6亿UUID,那么一次重复的概率约为50%。

答案 2 :(得分:2)

有几种不同的方法可以生成GUID。有些实现比其他实现更强大。一个好的GUID实现近似于一个随机的128位数,这意味着在GUID中可能存在2到128个不同的状态(大约是38到10的3.4倍)。算法通常不是完全随机的,可能包含有关GUID生成时间和/或生成机器的信息。

相比之下,observable universe中的21颗恒星估计有9×10。

如果您有38次状态的3到4次,并且您想要检查(可能很大的)状态样本以查看是否有任何两个状态相同,那就称为Birthday Problem。如果你仔细研究数学,你会发现你确实需要非常大量的样本才能有两个GUID相同的概率(如果GUID生成方法包含有关机器和/或生成时间的信息,只是如何生成GUID就会产生进一步的限制。

我最近对一组1,000,000个数据点进行了哈希冲突的计算,发现使用40位时,哈希冲突的概率非常非常低。对于128位,哈希冲突的可能性(对于相同的1,000,000个数据点)天文数据低。

答案 3 :(得分:-1)

据我所知,Guids在每台机器中的生成方式都不同,这意味着如果您现在开始在机器中创建它们,您将永远不会冒险创建与以太机器相同的机器。

如果您真的想强调这一点,您可以开始创建并将它们存储在该列中具有唯一索引的数据库中,并查看在检测到第一个冲突之前将插入多少行,我想您的应用程序将运行几年至少。

修改

它具有相同的IPv6地址范围,这是我在IPv6上发现的:

  

128位地址空间。换句话说理论上有   340,282,366,920,938,463,463,374,607,431,768,211,456地址   可用。这意味着大约有6.67 * 10 ^ 27的IPv6   我们星球上每平方米的地址。

你认为db表中的6.67 * 10 ^ 27条记录就够了吗?那么在这个星球的每一平方米,我们都有一台计算机可以生成自己的GUID,也可以在海洋,撒哈拉沙漠等地方......我想我们可以认为这个非常独特。