【问题标题】:Is it possible to create identical guids是否可以创建相同的指南
【发布时间】:2011-02-28 10:01:00
【问题描述】:

是否可以在一个应用程序中创建相同的 guid

Guid id = Guid.NewGuid();

【问题讨论】:

标签: c# .net guid


【解决方案1】:

从技术上讲,是的。例如,创建的 Guid 如下所示:

26de36b7-76f5-4f17-8f9d-44eb429f151b

这意味着 32 个字符可以是字母(26 种可能性)或数字(10 种可能性)

这意味着每个位置有 36 个可能性,总共 36^32,大约是。 60 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000。

这意味着,如果您每毫秒创建 2 000 000 000 000 000 000 000 000 000 000 000 000 000 个 Guid(这是不可能的),您平均会一次创建两次相同的 guid,而所有其他 guid将是独一无二的。

所以在实践中。没有;)

【讨论】:

  • GUID 不是用十六进制表示吗?如果是这样,你没有 26 个字母可供选择,你有 6 个。
  • @CraigW。 - 这是一个很好的观点:) 这意味着数学有点,但理论仍然相同:有 16 种可能性,这意味着可能的 GUID 的总数是 3,4e38 而不是 6,33e49。仍然足够高以避免碰撞。
【解决方案2】:

如果您问Guid.NewGuid() 创建重复 guid 的风险是否很高,那么答案是否定的。这取自Wikipedia

GUID 的值表示为 32 个字符的十六进制字符串,例如 {21EC2020-3AEA-1069-A2DD-08002B30309D},通常存储为 128 位整数。唯一键的总数为 2128 或 3.4×1038——大约每立方毫米地球体积有 2 万亿个。这个数字太大了,同一个数字被生成两次的概率极小。

如果您问我们如何创建两个重复的 guid,那么答案就是:

Guid g1 = new Guid("21EC2020-3AEA-1069-A2DD-08002B30309D");
Guid g2 = new Guid("21EC2020-3AEA-1069-A2DD-08002B30309D");

【讨论】:

    【解决方案3】:

    理论上?是的

    实际上?与创建两个相同的 GUID(即使在单个应用程序中)相比,您连续 10 次中奖的机会更高。

    Simple proof that GUID is not unique

    【讨论】:

    • 实际上,你可能有更好的机会在你的余生中每周赢得彩票(如果几率不可怕的话);)
    【解决方案4】:

    Guid.NewGuid() 将始终在全球范围内创建一个唯一的 Guid,而不仅仅是在单个应用程序中。

    【讨论】:

    • 没有了,请查看规范。至少,Windows 使用了 GUID 规范的 V4,唯一的部分已经减少到一个单一的系统。不太可能跨系统生成重复的密钥,但仍有可能。
    【解决方案5】:

    GUID 中的 U 代表唯一。 ;-) 所以这应该是不可能的。

    【讨论】:

    • 但确实如此。不太可能,但仍有可能。
    【解决方案6】:

    我实际上刚刚发生过这种情况。我有一个包含 7 个项目的数据库表。在我的程序中,我添加了一个新实例,使用 Guid.NewGuid() 作为其 ID。我收到了DbUpdateException,告诉我 ID 与现有 ID 相同。再试一次,效果很好。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多