我需要验证GUID的唯一性吗?
本文关键字:唯一性 GUID 验证 | 更新日期: 2023-09-27 18:06:56
我在同事写的源代码中看到了这个函数
private String GetNewAvailableId()
{
String newId = Guid.NewGuid().ToString();
while (clientsById.ContainsKey(newId))
{
newId = Guid.NewGuid().ToString();
}
return newId;
}
我想知道是否有一个场景,其中的guid可能不是唯一的?该代码用于多线程场景,clientsById
是GUID的字典和对象
这应该是完全不必要的- guid的全部意义在于消除对这类检查的需要:-)
你可能会对这篇关于GUID生成算法的有趣文章感兴趣:
- guid是全局唯一的,但guid的子字符串不是(旧的新东西)
该算法的目标是使用时间和位置的组合(对于相对论极客来说是"时空坐标")作为惟一键。但是,计时并不完美,因此有可能出现这样的情况,例如,同一台机器快速连续地生成两个guid,它们在时间上非常接近,以至于时间戳是相同的。这就是唯一修饰符的用武之地。当时间看起来停滞不前(如果对GUID的两个请求快速连续发出)或向后移动(如果系统时钟被设置为比原来更早的新时间)时,将增加唯一修饰符,以便从"第二次是5:00"生成的GUID不会与"第一次是5:00"生成的GUID冲突。
唯一可能发生冲突的情况是,有人在同一台机器上生成数千个guid,同时还反复将时间戳设置回相同的确切时间点。
根据定义,GUID是唯一的(全局唯一标识符)。没有必要检查唯一性,因为唯一性是GUID的目的。
唯一键的总数为2128或3.4×1038。这个数字是。大到随机产生相同数字的概率两次可以忽略不计。
引用自维基百科
根本不需要这种检查—GUID可以保证尽可能唯一,并且被复制的可能性非常低,永远。
从MSDN:GUID是一个128位整数(16字节),可以在所有需要唯一标识符的计算机和网络中使用。这样的标识符被复制的概率非常低。
和,同样来自MSDN:
新Guid的值全部为零或等于任何其他Guid的可能性非常低。
可以肯定的是,如果您在整个生命周期中从1,000个集合中获得一个冲突的GUID,那么您将是宇宙中最不幸的开发人员。
唯一GUID的个数。如果你真的想的话,你可以把支票放进去,但我真的不明白为什么要这么做。
Number of GUIDs 340,282,366,920,938,463,463,374,607,431,770,000,000 *