同一进程的两个线程可以生成相同的GUID吗?

mar*_*ark 20 .net multithreading guid

如果进程中的两个线程使用.NET API(Guid.NewGuid())同时生成新的GUID ,那么两个GUID可能是相同的吗?

谢谢.

更新 我希望变得实用.我知道人们普遍认为GUID在所有实际用途中都是独一无二的.我想知道我是否可以以相同的方式处理由同一进程的不同线程生成的GUIDS.

Dan*_*Tao 30

简答

可能(在宇宙的生命周期中,可能发生吗?)是.

可能(根本)?没有.


更长的答案

Microsoft使用版本4算法生成GUID(另请参见:此处),该算法生成完全(伪)随机数.

鉴于可能的GUID数量,重复概率很小.就像,不可思议的微小.

您关注的是并发性:幸运的NewGuid是,该方法是线程安全的,这意味着它可以锁定或利用线程静态随机数生成器来实现其目的.第一种方法将有效地序列化所有调用,NewGuid以便它们按顺序发生(从不同时发生),而后者将从彼此独立的线程进行调用.

在任何一种情况下,你不得不担心从两个线程同时创建随机数的重复项的唯一原因 - GUID或者不是 - 如果线程使用的基础生成器是从同一种子运行(1)来自设计缺陷的结果),以及(2)以时间依赖的方式(版本4 GUID算法没有).

所以是的,实际上,您可以将从单独线程同时生成的GUID视为唯一.


Jes*_*cer 8

不可能.静态方法Guid保证是线程安全的.见文档这里.

  • 它们是线程安全的,因为`NewGuid` 的代码是隔离的。多个并发调用生成相同 Guid 的可能性,无论多么渺茫,仍然存在。 (3认同)