我希望生成唯一ID,就像java中的自动增量一样。所以以前我使用当前纳秒秒,但我最终得到了冲突,因为两个数据在相同的纳秒时间内出现。 UUID是否解决了上述问题?
注意::在我的项目中,我甚至可以每分钟获得10000行记录,我会将这些记录与UIDS一起转储到表中。可能会出现这种情况,我会停止我的产品并重新启动它经过一段时间......所以在那种情况下,UUID课程如何澄清先前生成的UID(我存储在DB中),其中新的UID将被创建(但是要转储到DB中)?
答案 0 :(得分:11)
虽然UUID不是保证是唯一的,但重复的可能性非常低。请参阅Random UUID probability of duplicates。
对于您的应用程序,使用UUID是有意义的,但您可能想要处理极其罕见的情况,以防万一。
答案 1 :(得分: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);
这将在应用程序重新启动时启动计数器,并且它们在重新启动之间不会重叠,除非您每秒持续超过一百万个ID。 (在实例的整个生命周期中)
注意:这仅适用于每个实例。多个服务器需要使用不同的方法。
答案 2 :(得分:0)
此页面上关于UUID的性质似乎有些混乱。
研究Wikipedia页面。您将看到therme是UUID的不同版本。
原始版本代表了时间和空间上的一点,不再重复。它通过使用生成它的机器的MAC地址(一个空间点)来做到这一点。为此,它结合了当前时刻。添加一个任意数字,该数字在注意到计算机时钟发生变化时递增,而现在计算机具有内置电池和与时间服务器的网络连接就不再是一个大问题。通过将这些结合起来,几乎没有碰撞的机会。
由于担心跟踪和泄露MAC地址和时刻所涉及的安全性和隐私性问题,某些人可能不希望使用此版本。例如,Sun / Oracle选择在Java中不包含用于生成版本1 UUID值的实现。
一种常用的版本是版本4,其中128位中的122位是随机生成的。如果使用加密强度很高的随机数生成器,这将非常有效。与版本1中相比,发生冲突的可能性更高。但是对于大多数实际情况,基于随机的UUID完全可靠。