【问题标题】:Could this cause multiple identical GUIDs?这会导致多个相同的 GUID 吗?
【发布时间】:2011-03-01 13:19:38
【问题描述】:

由于 GUID 的生成是时间相关的,如果 System.Guid.NewGuid() 在不同线程的同一时刻被多次调用,它是否会返回相同的 GUID?

【问题讨论】:

    标签: c# guid collision


    【解决方案1】:

    在 Windows 上,GUID (UUID) 是从带有 UuidCreate 的加密随机数生成器创建的。就RFC 4122 而言,它们是版本4 UUID。不涉及时间戳或以太网卡,除非您使用的是使用 UuidCreateSequential 创建的旧式版本 1 GUID。

    另见How Random is System.Guid.NewGuid()? (Take two)

    【讨论】:

      【解决方案2】:

      不,它里面有一个序列号,每次调用都会改变,所以同一系统上不同线程上的多个同时调用不会创建重复的 Guid。

      这并不意味着 Guid 有一个可见部分,您可以看到每次调用的增量。

      【讨论】:

      • 看,这就是我的假设,但在任何地方都没有看到任何提及“内部序列号” - 你有参考吗?
      • 不幸的是我没有链接到我读到的提到这个序列号的文章,但是如果你查看 UuidCreate 的文档,它是在 Windows 中生成 Guid 的核心函数 (msdn.microsoft.com/en-us/library/Aa379205) ,您会看到它说“保证 UUID 仅对这台计算机是唯一的。”。显然,如果每次调用都没有至少一件事发生变化,它就无法做出这样的保证。
      • 一个 Uuid 应该是一个黑盒子,所以我怀疑你会从微软那里找到更多关于它们如何生成这些的确凿信息,但事实证明它是独一无二的应该足够了.不是吗?
      • 这是我发现的关于 UUID 生成的最完整说明:ietf.org/rfc/rfc4122.txt 我在这里看不到任何具体内容,但提到了每个最短时间间隔请求许多 UID 的情况,这是我感兴趣的情况。这完全取决于 .NET 如何实现算法 - 就我而言,您所指的陈述是相关的,但不是确定的。
      • 相信我,UUID 创建在 Windows 上是线程安全的,开发人员已经考虑过了。我曾经是微软 Windows 部门的开发人员,我已经看过源代码。 UuidCreateSequential 基本上遵循 RFC4122 的 4.2 节; UuidCreate 遵循第 4.4 节(随机)。 Guid.NewGuid 建立在 UuidCreate 之上。
      【解决方案3】:

      Transact-SQL NEWID 函数和应用程序 API 函数和方法根据其网卡的标识号加上 CPU 时钟的唯一编号生成新的 uniqueidentifier 值。每个网卡都有一个唯一的标识号。 NEWID 返回的 uniqueidentifier 值是使用服务器上的网卡生成的。应用API函数和方法返回的uniqueidentifier值是在客户端使用网卡生成的。

      .它不会根据msdn及时或在任何电脑中生成重复。

      【讨论】:

        【解决方案4】:

        除非您的线程在您机器上的不同内核上运行,否则在给定时间实际上只有一个线程在运行。因此,我认为对 NewGuid() 的调用不太可能同时发生。

        【讨论】:

        • 我不认为现在多核是那么荒谬,所以我会说它几乎可以保证今天的代码将在某个时候在多个核上运行。
        • 是的,但通常一个进程只在一个内核上运行(因为线程共享内存并且在运行同一进程的不同线程的内核之间传输内存是昂贵的。)至少,这是我记得的一年前我的操作系统课程。在这一点上我可能错了。
        • 对于缓存局部性,调度程序通常更愿意将线程与同一核心上的进程保持一致。但这很难保证。唯一可运行的线程可能都来自同一个进程。这在服务器应用程序中很常见。无论调度程序的变化如何,您都可以同时从多个进程创建 GUID。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 2021-04-10
        相关资源
        最近更新 更多