Java 使用UUID生成唯一id真的是唯一的吗?
我想要生成唯一的ID,就像java中的自动增量一样。所以之前我用的是当前的纳秒,但最后我用的是clash,因为两个数据在相同的纳秒中出现。。 UUID解决了上述问题吗Java 使用UUID生成唯一id真的是唯一的吗?,java,unique,uuid,Java,Unique,Uuid,我想要生成唯一的ID,就像java中的自动增量一样。所以之前我用的是当前的纳秒,但最后我用的是clash,因为两个数据在相同的纳秒中出现。。 UUID解决了上述问题吗 注意:在我的项目中,我甚至可以每分钟获得10000行记录,我会将这些记录连同UID一起转储到表中。可能会有一种情况,我会停止我的产品并在一段时间后重新启动它……所以在这种情况下,UUID类如何澄清先前生成的UID(我存储在DB中)新的UUID即将创建(尚未转储到DB中)?虽然UUID不能保证是唯一的,但复制的概率极低。看 对于您的
注意:在我的项目中,我甚至可以每分钟获得10000行记录,我会将这些记录连同UID一起转储到表中。可能会有一种情况,我会停止我的产品并在一段时间后重新启动它……所以在这种情况下,UUID类如何澄清先前生成的UID(我存储在DB中)新的UUID即将创建(尚未转储到DB中)?虽然UUID不能保证是唯一的,但复制的概率极低。看
对于您的应用程序,使用UUID是有意义的,但您可能需要处理这种极为罕见的情况,以防万一。我严重怀疑您在调用系统时在同一纳秒内获得两条记录。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,否则它们不会在重新启动之间重叠。(在实例的生命周期内)
注意:这仅适用于每个实例。多个服务器需要使用不同的方法。关于UUID的性质,这一页似乎有些混乱 学习。你会看到有不同的 你问: UUID解决了上述问题吗 是的,UUID值可以解决您的问题 时空上的一点 原作代表空间和时间上的一个点,永不重复 版本1通过使用生成它的机器的名称(空间中的一个点)来实现这一点。为此,它结合了当前时刻。添加一个任意数字,当注意到计算机时钟发生变化时,该数字将递增。现在,由于计算机内置了电池,并与时间服务器建立了网络连接,时钟不再是一个大问题。通过结合这些,没有实际的碰撞机会 由于对跟踪和泄露MAC地址和时刻所涉及的安全和隐私问题的担忧,一些人可能不想使用此版本。例如,省略从其类生成版本1 仅供参考,更强大的数据库服务器(如Postgres)可以生成UUID值,包括版本1。您可以选择在数据库服务器上而不是在应用程序中生成UUID 随机的
一个常用的版本是,其中随机生成122个。如果使用a,这是非常有效的。与版本1相比,此版本的碰撞几率要高得多。但对于大多数实际场景,基于随机的UUID是完全可靠的 是的,你能澄清一下“UUID生成的随机ID取决于时间戳”吗?那么它怎么能不保证唯一呢?根据,UUID是使用加密随机数生成器生成的。由于UUID的长度为128位,因此其大小有限,并且再次生成UUID的可能性非常小,但实际上不必担心。在我的项目中,我甚至可以每分钟获得10000行记录,我会将这些记录连同UID一起转储到表中。可能会有一种情况,我会在一段时间后停止我的产品并重新启动它……所以在这种情况下,UUID类如何澄清以前的错误生成的UID(我存储在DB中)和将要创建的新UID(尚未转储到DB中)?这就是加密随机数生成器的工作方式。它们生成一个(伪)随机数,并且范围足够大,使得碰撞几乎不成问题。