在多个 JVM 上,Java 的 UUID.randomUUID,冲突的概率是多少?

On Multiple JVM, Java's UUID.randomUUID, what is probability for collision?

我正在构建基于微服务的架构,其中多个微服务 运行 并行以实现水平可扩展性。 所有服务都使用相同的算法生成 UUID (UUID.randomUUID),一旦生成 UUID,它就会保存在数据库中并返回给调用服务。几秒钟后,调用方发送请求以使用 UUID 验证 txn 的状态。

在关系数据库中,UUID 是主键,我们已经看到不同服务生成的 UUID 发生冲突。问题

  1. 跨 JVM 重复 UUID 的可能性有多大?
  2. 我们是否应该在代码中添加一些逻辑以在将其保存到数据库之前验证冲突?
  1. What is possibility of duplicate UUID across JVMs.

有可能,但概率微乎其微。关于生日问题的维基百科页面有一个 probability table 可用于估计碰撞的可能性。

例如,对于 128 位随机 UUID(和高质量随机数生成器),table 表示您需要生成 2.6 x 1010 UUID碰撞概率达到10分之一18.

在本文的前面,您将找到有关计算...和估计...概率的数学知识。

  1. Should we add some logic in code to verify collision before saving it to DB?

这实际上取决于您可能生成和存储的 UUID 的数量,以及您愿意接受的冲突概率。

但是,如果您担心发生冲突的可能性,您可以将 UUID 列设置为相关数据库 table 中的唯一键。由于硬件错误导致事务失败的可能性大于导致唯一性约束失败的冲突!


跟进问题:

I am not sure if this probability is for one generator or multiple?

生成器的数量无关紧要,前提是它们是>独立<随机数生成器。

As we have seen collision few hundred times with 1 million txns.

数学不会说谎。如果您在 100 万笔交易中看到了数百次冲突,那么 其他 是错误的。假设不正确。

例如:

  • 可能您使用的是弱 PRNG。
  • 也许您在为 PRNG 播种时使用了固定种子或使用了较差的熵源。
  • 也许您修改(例如缩短)UUID 的方式大大减少了它们的有效位数。
  • 也许您的 UUID 生成方法中的某些内容导致 UUID 连续发出两次......有时。
  • 也许对象在不应该被复制的时候被复制了......你最终得到了一个具有相同 UUID 的对象的两个副本。
  • 也许有人/某事在伪造 UUID。

在你开始怀疑数学之前,你需要检查很多东西。

My doubt is all 4 services are using same algorithm the probability will increase.

正如我所说,生成器的数量不会改变数学。