如果进程中的两个线程使用.NET API(Guid.NewGuid()
)同时生成新的GUID,那么两个GUID可能是相同的吗?
感谢。
更新 我想变得实用。我知道人们普遍认为GUID在所有实际用途中都是独一无二的。我想知道我是否可以以相同的方式处理由同一过程的不同线程产生的GUIDS。
答案 0 :(得分:29)
可能(例如,在宇宙的生命周期中,曾经发生)?是。
可能(在所有)?否。
Microsoft使用Version 4 algorithm生成GUID(另请参阅:here),它会生成完全(伪)随机数。
考虑到可能的GUID数量,probability of a duplicate很小。比如,不可思议很小。
您关注并发性:幸运的是,NewGuid
方法是thread-safe,这意味着它可以锁定或利用线程静态随机数生成器来实现其目的。第一种方法将有效地序列化所有对NewGuid
的调用,以便它们按顺序发生(从不同时发生),而后者将从彼此独立的线程进行调用。
在任何一种情况下,你不得不担心从两个线程同时创建随机数的重复 - GUID
或不是 - 将是线程使用的基础生成器是否正在运行(1)来自同一种子(只能由设计缺陷引起),和(2)以时间相关的方式(版本4 GUID算法没有)。
所以是的,实际上,您可以将从不同线程同时生成的GUID视为唯一。
答案 1 :(得分:8)
不可能。 Guid
的静态方法保证是线程安全的。请参阅文档here。
答案 2 :(得分:1)
不太可能发生......
http://msdn.microsoft.com/en-gb/library/system.guid(v=VS.95).aspx
此类型的任何公共静态(在Visual Basic中为Shared)成员都是线程安全的。任何实例成员都不保证是线程安全的。[...]
GUID是128位整数(16字节) 可以在所有计算机上使用 和网络无论在哪里都是独特的 标识符是必需的。这样的 标识符的概率非常低 被复制的。
答案 3 :(得分:1)
嗯,.Net的当前实现在内部使用CoCreateGuid:
在很高的确定性下,此函数返回一个唯一值 - 在同一个或任何其他系统(联网或不联网)上没有其他调用应该返回相同的值。