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

12
假设我想把一个guid设置为我的应用程序的程序集guid。从互联网上搜索得知,我们可以使用 (new Guid()).Next() 来获取一个新的唯一值。

我无法确定我的guid在其他guid中是唯一的。如果您知道如何确保,请解释一下。


这可能有所帮助:https://dev59.com/enVD5IYBdhLWcg3wQJOT - Moslem Hadi
3个回答

8
您唯一拥有的保证就是概率在您这边。有2^128个可能的GUID和创造过程中的一些巧妙方法,使得出现重复的可能性非常小。
看起来在Windows上V4是标准GUID。如果该GUID纯粹基于伪随机数生成器(如维基百科所示),则会受到生日问题的影响。
我看过一些使用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 个GUIDs。如果你每秒创建1000个GUIDs,那么在达到一百万分之一的风险之前,你可以持续进行近206667年。 6,52191054316287e15/(3600*24*365,25*1000) ≈ 206666,874006986 我所有计算都正确的概率 →0。

6

3

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

算法

在生成新的(V1)GUID的OSF指定算法中,用户的网络卡MAC地址被用作GUID最后一组数字的基础,这意味着例如可以追溯到创建它的计算机的文档。当查找Melissa worm的创造者时使用了这个隐私漏洞[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]。


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