如何确保生成的guid在全球范围内是唯一的?

时间:2010-10-20 06:38:22

标签: c# guid

假设我想设置一个guid作为我的应用程序的汇编guid。从互联网搜索时,我们可以使用(new Guid()).Next()获取新的唯一值。

我无法弄清楚我的guid如何保证与他人不同?如果您知道如何,请解释。

3 个答案:

答案 0 :(得分:7)

唯一的保证就是概率就在你身边。 2 ^ 128个可能的GUID和创建过程中的一些聪明使得你不太可能看到重复。

似乎V4是Windows上的标准GUID。如果那个纯粹基于伪随机数生成器,正如维基百科似乎指出的那样,它受Birthday problem的影响。

我见过几个使用128位的例子来证明复制几乎是不可能的。那些经常会错过两件事。生日问题和V4 GUID实际上是124位。

您需要1/2+sqrt(1/4-2*2^124*ln(0,5)) ≈ 5.4*10^18 GUID才能达到重复的50%。这仍然很多,但50%可能不是你正在寻找的交易。假设你希望它是一百万分之一来获得重复,那么你可以拥有sqrt(2*2^124*ln(1/(1-0,000001)))≈6,5* 10 ^ 15 GUID。如果你每秒创建一千个GUID,你可以继续这样做将近206667年,然后再达到百万到百万的风险。 6,52191054316287e15/(3600*24*365,25*1000) ≈ 206666,874006986

我获得所有这些计算的机会正确→0。

答案 1 :(得分:6)

不是,但是它的生成方式和表示方式使得在这个里程中生成两个相同GUID的概率几乎为零。

请参阅:Simple proof that GUID is not unique

答案 2 :(得分:3)

来自http://en.wikipedia.org/wiki/Globally_unique_identifier

算法

在用于生成新(V1)GUID的OSF指定算法中,用户的网卡MAC地址用作最后一组GUID数字的基础,这意味着,例如,可以追溯文档创建它的计算机。在找到Melissa蠕虫的创造者时使用了这个隐私漏洞[2]。大多数其他数字基于生成GUID时的时间。

包含MAC地址和时间的V1 GUID可以通过第三组数字的第一个位置中的数字“1”来标识,例如{2f1e4fc0-81fd-11da-9156-00036a0f876a}。

V4 GUID使用后来的算法,这是一个伪随机数。它们在相同位置具有“4”,例如{38a52be4-9352-453e-af97-5c3b448652f0}。更具体地说,'data3'位模式在第一种情况下是0001xxxxxxxxxxxx,在第二种情况下是0100xxxxxxxxxxxx。 WinAPI GUID生成器的密码分析显示,因为V4 GUID的序列是伪随机的;在完全了解内部状态的情况下,可以预测先前和后续的值。[3]。