【问题标题】:Can machine-generated UUID produce only zeroes?机器生成的 UUID 可以只产生零吗?
【发布时间】:2015-01-27 17:03:45
【问题描述】:

UUID(或 GUID)算法会生成“人工”数字吗?

如:

  • 00000000-0000-0000-0000-000000000001
  • 11111111-2222-3333-4444-555555555555
  • 12345678-...
  • AAAAAAA-...

我想知道将 GUID 手动设置为生成自己的 PK(TSQL 中的新 ID 或 NEWSEQUENTIALID)的表的 PK 是否安全。

【问题讨论】:

  • 为什么这些样本值会有问题?
  • 虽然我不知道生成算法的实际实现,但如果它只是一个随机字节字符串,它总是可能生成任何字节组合,包括,比如说,000000(虽然非常不太可能)。
  • 我在受人尊敬的产品中遇到过这样的“虚假”UUID。例如:Apple 使用 'FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000' 作为 osx 中的 root 用户 ID。

标签: algorithm primary-key guid uuid


【解决方案1】:

生成任何特定 GUID 的概率为 2-128,因此无论您将什么 GUID 设置为 PK,生成重复的机会都很小。有多小?与生成重复的 GUID 相比,您赢得纽约彩票的机会大约是 10 亿美元或 1030,高,因此您非常安全。

当您需要使用固定 ID 时,通常的做法是在您的计算机上生成 GUID,例如,通过 Visual Studio 菜单或编写一个小程序,然后将该 GUID 硬编码到您的程序中作为“众所周知的价值”。

【讨论】:

    【解决方案2】:

    http://en.wikipedia.org/wiki/Universally_unique_identifier 和http://www.ietf.org/rfc/rfc4122.txt 中指定了多种 GUID 的格式,在任何情况下,任意选择都可能不会与任何正确创建的 GUID 冲突。

    但是,您选择的任意 GUID 可能与其他人选择的任意 GUID 相同 - 因为你们都违反了规则。为避免这种情况,我建议您获取自己正确创建的 GUID,并将其作为配置设置放入或将其硬连接到您的代码中。 linux 上有一个用于生成 GUID 的名为 uuidgen 的命令行程序,它随 Windows SDK 一起提供。快速搜索表明您也可以通过网页生成一个,例如http://www.famkruithof.net/uuid/uuidgen 和https://www.guidgenerator.com/online-guid-generator.aspx。

    这里有一些新生成的 GUID

    {CB58921C-66A9-4C64-B2F4-413166736071}

    {8FE41A9D-A0AC-4D32-8C10-48796DEFBD9C}

    {E280FE84-0E60-4880-91DC-7A7BB886E1EE}

    (来自我在 http://www.somacon.com/p113.php 找到的脚本)。

    【讨论】:

      【解决方案3】:

      在 Windows PC 上生成 GUID 的典型算法是连接两个十六进制编码值,通常是 MAC 地址的一部分和当前时间戳(因此同一台 PC 生成的所有 GUID 将仅在时间戳部分不同) .因此,在您的情况下,PC 几乎不可能随机生成您的样本值。

      【讨论】:

      • 据我所知,他们切换到变体 4 UUID(随机)以避免信息泄露。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      • 1970-01-01
      • 2016-11-10
      相关资源
      最近更新 更多