5

从数学上讲,我想即使是使用 .NET 框架中的内置方法生成的两个随机 GUID 也有可能是相同的,但是如果您生成数百或数千个,它们发生冲突的可能性有多大呢?

如果您为世界上的每个 Windows 副本生成一个,它们会发生冲突吗?

我问的原因是因为我有一个程序可以创建很多对象,并销毁一些对象,我想知道这些对象中的任何一个(包括被销毁的对象)是否具有相同的 GUID。

4

7 回答 7

7

有 ~3E38 个可能的 GUID 值。但是生日悖论将产生重复 GUID 的几率降低到 1E19 的 50/50。虽然仍然是一个巨大的数字,但与您的机器首先被流星撞击摧毁的可能性相比相当有利,但系统时钟用于确保不会发生重复。

许多大型和关键任务 dbase 应用程序使用 GUID 作为表中的主键。不要犹豫,跟随他们的步伐。

于 2010-04-11T18:07:12.357 回答
5

GUID 的组件基于

  • 时间(系统时钟)

  • 空格(系统 MAC 地址)

  • 随机数

因此,如果同时为世界上的每台机器生成一个,它们的 MAC 和随机数会有所不同

这是一个有用的链接。http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx

于 2010-04-11T17:41:48.413 回答
1

这根本不是你应该关心的事情。这只是工作中的可用性启发式。这是您知道并认识到的“风险”,因此您想关心它。但还有许多其他风险的可能性要高出数百万倍,我们仍然不必担心。我认为这本精彩的 Pro Git 书说得最好:

您的编程团队的每个成员都更有可能在同一晚在不相关的事件中被狼袭击和杀死。

你必须产生数百万或数十亿美元才能让它成为一个遥远的可能性。

于 2010-04-20T07:31:53.760 回答
1

如果不知道 GUID 生成器实现的内部细节,就很难计算机会。

您可以使用组合学来获取数字,但这只会帮助您假设组合的可能性相同。因此,如果没有任何关于实施的统计知识 - 很难说出真正的机会。

与 Midhat 所暗示的相反(如果我理解正确的话),GUID 冲突是可能的。内置随机数生成器通常使用基于时间戳的种子来实现。MAC地址本质上不是唯一的,因为它们可以在许多情况下被覆盖(至少在我知道的某些情况下它们是)。两个 GUID 生成器可能会获得相同的输入,从而产生相同的输出。

GUID 的长度为 128 位,因此“足以供所有人使用”,但这并不能保证不会发生冲突。

于 2010-04-11T17:51:08.247 回答
1

在过去的 25 年中,我一直使用 RPC 和 COM(其中 GUID 和 UUID 至关重要)以及使用 GUID 作为唯一行标识符的分布式数据库,我从未遇到过冲突问题——无论它们是在单台机器上生成还是不同的机器。MSDN 对此的另一个有趣的看法,其中作为 rowid,它们的寿命比作为对象要长得多: http ://weblogs.asp.net/wwright/archive/2007/11/04/the-gospel-of-the-guid-and -为什么重要.aspx

于 2010-04-11T18:21:45.880 回答
0

只是为了补充 Midhat 的正确答案,这里引用Eric Lippert 的博客关于系统中没有安装网卡(因此没有 MAC 地址)的情况:

(没有网卡的机器会生成特殊的 GUID,这些 GUID 在“已知可能不是唯一的”范围内。)

于 2010-04-11T17:49:52.093 回答
0

这将需要很长时间!

于 2010-04-11T17:42:32.360 回答