【问题标题】:unique Number generation by UUID in Java ?在 Java 中通过 UUID 生成唯一数字?
【发布时间】:2012-08-29 05:42:57
【问题描述】:

我正在查看一段代码,我可以看到已经编写了以下代码,该代码生成了一个字符串,并且该字符串已被设置为表的主键。

return new BigInteger(UUID.randomUUID().toString().replaceAll("-", ""), 16).toString(36);

到目前为止,有很多记录,并且它们似乎是唯一的,因为没有违反主键约束。

我知道这个数字是随机的,但它是唯一的吗?

谢谢

吐槽

【问题讨论】:

  • 附带问题:既然您仍然使用字符串作为主键:您为什么不使用 UUID.randomUUID().toString()?这样,数据库的其他用户就知道主键是 UUID。
  • 引自维基百科 (en.wikipedia.org/wiki/Universally_unique_identifier) > 换句话说,只有在接下来的 100 年每秒生成 10 亿个 UUID 之后,仅创建一个副本的概率约为 50%。跨度>
  • 我忘了提到代码已经到位并且正在生产中并且到目前为止运行良好。

标签: java uuid


【解决方案1】:

无法保证这些数字是唯一的,但是由于范围如此之大,因此极不可能生成重复。

即使考虑了birthday paradox,机会也非常低。

【讨论】:

    【解决方案2】:

    randomUUID 函数使用“强加密伪随机数生成器”(来自 Javadoc)。这意味着随机生成背后有一些数学运算可以最大限度地降低碰撞风险(两个数字匹配)。

    不能 100% 保证这些数字是完全唯一的;但是,两个数字匹配的可能性很小。

    【讨论】:

      【解决方案3】:

      引用迈克尔·博格沃特的话

      UUID 使用java.security.SecureRandom,它应该是“加密强”。虽然未指定实际实现并且在 JVM 之间可能会有所不同(这意味着所做的任何具体语句仅对一个特定的 JVM 有效),但它确实要求输出必须通过统计随机数生成器测试。

      您还可以阅读how good is java's UUID.randomUUID?How unique is UUID? 了解更多信息

      【讨论】:

        【解决方案4】:

        UUID 实际上是普遍唯一的标识符。它的一些用途是用于创建随机文件名、Web 应用程序中的会话 ID、事务 ID 以及用于替换数据库中记录的主键或自动生成的数字。

        【讨论】:

          猜你喜欢
          • 2020-06-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-25
          • 1970-01-01
          • 2021-06-24
          • 1970-01-01
          相关资源
          最近更新 更多