使用UUID的唯一ID生成真的很独特吗?

我想生成唯一的ID就像java中的自动增量一样。 所以以前我使用当前纳秒秒,但我最终得到了冲突,因为两个数据在相同的纳秒时间内出现.UUID是否解决了上述问题?

注意::在我的项目中,我甚至可以每分钟获得10000行记录,我会将这些记录和UIDS一起转储到表中。可能会出现这样的情况:我会停止我的产品并在一段时间后重新启动它….所以在那种情况下,UUID类如何澄清先前生成的UID(我存储在DB中)将要创建的新UID(尚未转储到DB中)?

虽然不保证 UUID是唯一的,但重复的可能性极低。 请参阅随机UUID重复概率 。

对于您的应用程序,使用UUID是有意义的,但您可能想要处理极其罕见的情况,以防万一。

我非常怀疑你在同一纳秒内得到两条记录,因为调用System.nanoTime()需要100 ns。 您的时钟更有可能没有纳秒精度。

但是,如果重新启动服务器,则可以重复nanoTime()。

解决这个问题的一种方法是使用

AtomicLong counter = new AtomicLong(System.currentTimeMillis()*1000); long id = counter.incrementAndGet(); // something like ctz9yamgu8 String id = Long.toString(counter.incrementAndGet(), 36); 

这将在应用程序重新启动时启动计数器,并且在重新启动之间不会重叠,除非您每秒持续超过一百万个ID。 (在实例的生命周期内)

注意:这仅适用于每个实例。 多个服务器需要使用不同的方法。