.NET的GUID结构

时间:2010-11-30 07:41:21

标签: c# .net algorithm guid probability

http://msdn.microsoft.com/en-us/library/system.guid.aspx

它是如何工作的?它如何保证唯一ID?它只依赖于概率还是还有其他技巧?我是否可以始终相信它可以提供独特的身份证明或者我应该避免使用guid的情况?

5 个答案:

答案 0 :(得分:7)

这是一个有趣的小程序:

class Program
{
    static void Main(string[] args)
    {
        var guids = new HashSet<string>();
        var sw = Stopwatch.StartNew();

        while(true)
        {
            var guid = Guid.NewGuid().ToString().Replace("-", "").Substring(0, 16);
            if (guids.Contains(guid)) break;
            guids.Add(guid);
        }

        Console.WriteLine("Duplicate found in {0} ms, after {1} items.", sw.ElapsedMilliseconds, guids.Count);
        Console.ReadLine();
    }
}

我敢打赌,在找到傻瓜之前,你的内存会耗尽;)

编辑即使仅使用一半Guid。

答案 1 :(得分:3)

Guid不会保证一个唯一ID,它生成重复ID的概率非常低。

答案 2 :(得分:1)

首先,Guid结构本身并不保证你可以通过显式构造函数自己创建许多guid:var myGuid = new Guid(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 });这样你就可以创建你喜欢的Guids数量。

但我想你的意思是用静态方法Guid.NewGuid()创建的Guids。在备注部分,注意到Guid全部为零或等于另一个Guid的概率很低。

您还可以阅读描述如何创建Guid随机性的RFC

答案 3 :(得分:1)

它使用专门用于生成唯一ID的算法。是的,他们可能会发生碰撞,但这种可能性很小。另请参阅this closely related question

答案 4 :(得分:0)

.NET Guid.NewGuid()实际上调用了ole32.dll中的函数CoCreateGuid,它是Windows“核心”的一部分。

CoCreateGuid正在调用创建such thing的函数UuidCreate,这实际上是Guid的“低级别”。

根据我的阅读和理解(非正式答案),它是使用机器的MAC地址和当前系统时间(自1970年1月1日以来经过的毫秒数)的组合生成的,也可能是随机数但是我不确定这一点。

避免在Albin发布的link的“安全注意事项”部分中描述的情况下使用GUID。

所有其他问题已在其他答案中得到解答,没有必要重复。:)