在多个JVM上,Java';随机UUID,碰撞的概率是多少?
我正在构建基于微服务的体系结构,其中多个微服务并行运行以实现水平可扩展性。 所有服务都使用相同的算法来生成UUID(UUID.randomUUID),一旦生成UUID,它就会保存在数据库中并返回给调用服务。几秒钟后,调用方发送请求,用UUID验证txn的状态 在关系数据库中,UUID是主键,我们看到了由不同服务生成的UUID的冲突。问题在多个JVM上,Java';随机UUID,碰撞的概率是多少?,java,uuid,Java,Uuid,我正在构建基于微服务的体系结构,其中多个微服务并行运行以实现水平可扩展性。 所有服务都使用相同的算法来生成UUID(UUID.randomUUID),一旦生成UUID,它就会保存在数据库中并返回给调用服务。几秒钟后,调用方发送请求,用UUID验证txn的状态 在关系数据库中,UUID是主键,我们看到了由不同服务生成的UUID的冲突。问题 跨JVM复制UUID的可能性有多大 在将冲突保存到DB之前,我们是否应该在代码中添加一些逻辑来验证冲突 跨JVM复制UUID的可能性有多大 这是可能的,但可能性
后续问题: 我不确定这个概率是针对一台发电机还是多台发电机 生成器的数量不相关,前提是它们是>独立<随机数生成器 正如我们所看到的,与100万TXN发生了数百次碰撞 数学不会说谎。如果您已经看到了与一百万个事务的数百次冲突,那么其他一些事情是错误的。这些假设是不正确的 例如:
- 也许你使用的是弱PRNG
- 也许你正在使用一个固定的种子,或者在播种PRNG时使用了一个很差的熵源
- 也许您正在修改(例如缩短)UUID,从而大大减少其有效位计数
- 也许您的UUID生成方法中的某些东西导致UUID连续发布两次。。。有时候
- 也许对象在不应该被复制的时候被复制了。。。最终得到一个对象的两个副本,它们具有相同的UUID
- 也许有人/什么东西在伪造UUID
正如我所说,发电机的数量并不会改变数学计算。目前大多数实际服务实际上只是假装碰撞不是一件事——因为概率很低。对于与散列的冲突(如SHA或MD5)也是如此。显然,这取决于您计划处理的数量,但通常情况下,这一事实在大多数情况下确实被忽略。我们正在使用4个微服务测试1M事务,并且由于UUID冲突,我们每次可以有几百次失败。感谢链接,但我不确定这一概率是针对一个生成器还是多个生成器?正如我们所看到的,与100万TXN发生了数百次碰撞。我怀疑所有4个服务都使用相同的算法,概率会增加。谢谢@stephen,我现在找到了根本原因。正如您所提到的,我在DB端对日志进行了更多的挖掘,发现有一些脚本正在运行,这造成了这种混乱。谢谢你的帮助。