Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用UUID生成唯一id真的是唯一的吗?_Java_Unique_Uuid - Fatal编程技术网

Java 使用UUID生成唯一id真的是唯一的吗?

Java 使用UUID生成唯一id真的是唯一的吗?,java,unique,uuid,Java,Unique,Uuid,我想要生成唯一的ID,就像java中的自动增量一样。所以之前我用的是当前的纳秒,但最后我用的是clash,因为两个数据在相同的纳秒中出现。。 UUID解决了上述问题吗 注意:在我的项目中,我甚至可以每分钟获得10000行记录,我会将这些记录连同UID一起转储到表中。可能会有一种情况,我会停止我的产品并在一段时间后重新启动它……所以在这种情况下,UUID类如何澄清先前生成的UID(我存储在DB中)新的UUID即将创建(尚未转储到DB中)?虽然UUID不能保证是唯一的,但复制的概率极低。看 对于您的

我想要生成唯一的ID,就像java中的自动增量一样。所以之前我用的是当前的纳秒,但最后我用的是clash,因为两个数据在相同的纳秒中出现。。 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中)?这就是加密随机数生成器的工作方式。它们生成一个(伪)随机数,并且范围足够大,使得碰撞几乎不成问题。