我是否需要验证GUID的唯一性?

时间:2011-08-26 12:25:49

标签: c# .net guid

我在同事写的一个来源中看到了这个功能

private String GetNewAvailableId()
{
    String newId = Guid.NewGuid().ToString();

    while (clientsById.ContainsKey(newId))
    {
        newId = Guid.NewGuid().ToString();
    }

    return newId;
}

我想知道是否存在guid可能不是唯一的情况? 代码用于多线程场景,clientsById是GUID和对象的字典

4 个答案:

答案 0 :(得分:9)

这应该是完全不必要的 - GUID的重点是消除对这类检查的需要: - )

您可能会对阅读有关GUID生成算法的有趣帖子感兴趣:

  

此算法的目标是使用时间和位置的组合(相对论极客的“时空坐标”)作为唯一性键。然而,计时并不完美,因此有可能例如从同一台机器快速连续地生成两个GUID,因此时间戳彼此接近以使时间戳相同。这就是uniquifier的用武之地。当时间似乎停滞不前(如果快速连续发出两个GUID请求)或者向后退(如果系统时钟设置为比它早的新时间),则无统一增加,以便从“第二次它是五点钟”生成的GUID不会与“第一次是五点钟”生成的GUID相冲突。

唯一可能发生冲突的方法是,如果有人在同一台计算机上生成了数千个GUID,同时又重复将时间戳设置回同一时间点。

答案 1 :(得分:3)

根据定义,GUID是唯一的(全局唯一标识符)。没有必要检查唯一性,因为唯一性是GUID的目的。

  

唯一键的总数是2 128 或3.4×10 38 。这个数字是这样的   大,相同数字的概率是随机生成的   两次可以忽略不计。

引自Wikipedia

答案 2 :(得分:2)

根本不需要这项检查 - 保证GUID尽可能独特,有时间,并且复制的可能性非常低,永远

来自MSDN

  

GUID是一个128位整数(16字节),可以在需要唯一标识符的所有计算机和网络中使用。这样的标识符被复制的可能性非常低。

再次来自MSDN

  

新Guid的值全部为0或等于任何其他Guid的可能性非常低。

可以肯定的是,如果你要在整个生命周期中从一千个集合中获得一个冲突的GUID,那么你就是宇宙中最不幸的开发者。

答案 3 :(得分:1)

唯一GUID的数量。如果你真的想要,你可以加入支票,但我不知道为什么这些赔率。

Number of GUIDs 340,282,366,920,938,463,463,374,607,431,770,000,000 *