我在同事写的一个来源中看到了这个功能
private String GetNewAvailableId()
{
String newId = Guid.NewGuid().ToString();
while (clientsById.ContainsKey(newId))
{
newId = Guid.NewGuid().ToString();
}
return newId;
}
我想知道是否存在guid可能不是唯一的情况?
代码用于多线程场景,clientsById
是GUID和对象的字典
答案 0 :(得分:9)
这应该是完全不必要的 - GUID的重点是消除对这类检查的需要: - )
您可能会对阅读有关GUID生成算法的有趣帖子感兴趣:
此算法的目标是使用时间和位置的组合(相对论极客的“时空坐标”)作为唯一性键。然而,计时并不完美,因此有可能例如从同一台机器快速连续地生成两个GUID,因此时间戳彼此接近以使时间戳相同。这就是uniquifier的用武之地。当时间似乎停滞不前(如果快速连续发出两个GUID请求)或者向后退(如果系统时钟设置为比它早的新时间),则无统一增加,以便从“第二次它是五点钟”生成的GUID不会与“第一次是五点钟”生成的GUID相冲突。
唯一可能发生冲突的方法是,如果有人在同一台计算机上生成了数千个GUID,同时又重复将时间戳设置回同一时间点。
答案 1 :(得分:3)
根据定义,GUID是唯一的(全局唯一标识符)。没有必要检查唯一性,因为唯一性是GUID的目的。
唯一键的总数是2 128 或3.4×10 38 。这个数字是这样的 大,相同数字的概率是随机生成的 两次可以忽略不计。
答案 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 *