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

vij*_*arj 10 java uuid unique

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

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

Abd*_*ahC 11

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

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


Pet*_*rey 7

我非常怀疑你在同一纳秒内得到两条记录,因为调用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);
Run Code Online (Sandbox Code Playgroud)

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

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