【问题标题】:Guid Uniqueness On different machine [duplicate]Guid在不同机器上的唯一性[重复]
【发布时间】:2012-12-13 23:57:02
【问题描述】:

可能重复:
Is a GUID unique 100% of the time?

在阅读了关于 Guid 的所有帖子后,我仍然不清楚一件简单的事情:

不同机器生成的Guids也保持其唯一性。

我已经阅读了关于单机上的 guid 唯一性,但我仍然不知道不同机器上的唯一性

【问题讨论】:

  • 但是两个系统如何管理它必须创建不同的 guid..guid 生成器是如何工作的?它如何每次都创建唯一的 guid?
  • 它们是随机的。有这么多随机组合,我们只是“相信”它会是独一无二的。除非您使用顺序 guid,否则您将活不到足够长的时间来看到骗子:)。
  • 取一个 1 到 100 之间的随机数。再做一次。您第二次获得相同数字的几率是 100 分之一。现在取 1 到 5,316,911,983,139,663,491,615,228,241,121,400,000 之间的随机数。这个号码没有名字。
  • @flem - 或者提供 GUID 的有缺陷的 RND 生成器。它还取决于 UUID 规范中的 GUID 类型。

标签: c# sql-server programming-languages operating-system guid


【解决方案1】:

普遍认为新的随机 GUID 总是唯一的。概率上这不是真的,但是产生欺骗的可能性是如此之小,我们不需要关心它。

生成两个相同 guid 的几率是 5,316,911,983,139,663,491,615,228,241,121,400,000 分之一

因此,如果您在 100 万台计算机上生成 100 万个 guid,则生成重复的几率为:5,316,911,983,139,663,491,615,228 分之一

在 10 亿台计算机上使用 10 亿个 guid,产生欺骗的几率是: 5,316,911,983,139,663,491 分之一(即 5.3 quintillion)。

数字不言自明,你不会产生欺骗。

如果您想知道我从哪里得到这些数字,GUID 的值部分是 122 位。 2^122 是 5.3169119831396634916152282411214 x 10^36

一些更疯狂的数字...
如果您每秒生成 100 万个 guid,则可能需要 168,486,464,147,580,370,470,736 年才能保证重复。

@viggity 提到一些 guid 有 48 位由 mac 地址占用,这些数字仍然令人震惊,因此 丢失 这些位的负担能力。以上面每秒 200 万个 guid 的例子(在同一台计算机上),仍然需要 598,584,166 年才能保证被骗。那是6亿年。这比地球上存在的生命还要长。或者,如果您是年轻的地球创造论者,那至少是地球寿命的 6 万倍。

【讨论】:

  • 只是为了添加到讨论中,引用维基百科条目中关于 GUID 的引述:“一些有缺陷的 GUID 生成实现依赖于使用随机数种子源的伪随机数生成器,结果证明是可预测的”。所以在数学上,有 2^122 个可能的值(保留 6 位以指示随机 GUID),但实际上它可能会受到 RND 函数的限制。
  • +1 让我大吃一惊
  • 完全偏离主题,创造论者可能会使用 14 位 GUID,可能会挑战 122 位 GUID,声称它代表的数字大于地球的年龄,因此不是真实的。
  • @Wimbo - 有争议! :)
  • -1 表示错误概率并完全忽略 4/5 UUID 生成方案。由于生日问题,重复的几率实际上明显高于您的数字。现在,有了 122 个随机位,十亿仍然不足以产生碰撞的可能性。但是根据您生成的类型、生成它们的速度以及使用的不同机器的数量,由于鸽巢原理,几率为 1。一些 UUID 包括时间戳、MAC 地址、“域 ID”和其他值,这些值在很长一段时间内或对于给定计算机肯定不是唯一的。
【解决方案2】:

GUID“实际上”普遍是唯一的。

GUID 是一个 128 位整数(16 个字节),可以在需要唯一标识符的所有计算机和网络中使用。这样的标识符被复制的概率非常低。

来自MSDN

【讨论】:

  • “通用”意味着“不同的机器”,因为所有机器都是“宇宙”的一部分
  • 但是两个系统如何管理它必须创建不同的 guid..guid 生成器是如何工作的?它如何每次都创建唯一的 guid?
  • 阅读维基百科上的Guid Generation Algorithm
  • 不要相信这些数字。我在 JS、PHP、Ruby 和几个分布式 DBMS 中测试了 GUID v4 随机数,并在几千到几百万次测试中发现了许多冲突。始终测试唯一性。另见:usecuid.org
【解决方案3】:

我记得在某处听说过,如果您将 IPV4 地址空间(32 位)想象为邮票的大小,那么 IPV6(128 位)就是我们太阳系的大小。产生欺骗是不会发生的。

另外,如果有什么不同的话,您更有可能在同一台机器上获得重复而不是两台不同的机器,因为大多数 Guid 生成算法会将您的计算机 NIC MAC 地址嵌入到 guid 中(它是 48 位)。虽然有些算法不嵌入 MAC 地址,只是纯粹随机的。见:http://guid.us/

编辑:另一个有趣的比例示例 地球的体积大约是 10^27 立方厘米。这意味着地球整个体积的每立方厘米都可以拥有 340,000,000,000 guid。这个数字大得令人难以置信。

或者,地球表面的每平方纳米表本身可能有大约 650,000 个 guid。

【讨论】:

  • > 大多数 Guid 生成算法会将您的计算机 NIC MAC 地址嵌入到 guid 中(它是 48 位)哇,这太傻了。为此撕掉48位?有什么理由这样做吗?
  • guid.us/Test/GUID 显示 CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC 是一个有效的 guid
  • @vbullinger 是的,这是有原因的,即使 GUID 的其余部分相同(它使用时间戳,所以想法是两台机器可能会尝试在同时)不会碰撞。但是,此类 GUID 已不再适用;如今,完全基于一个大随机数的 GUID 更为常见。
  • MAC 地址失宠,因为在 VM 中生成的 GUID 往往不是唯一的。在 VM 中每秒仅生成 1000 个 GUID,使用 MAC 地址 GUID 生成版本,您将获得相同的 GUID 生成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 2022-08-22
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 2011-01-09
相关资源
最近更新 更多