Java Instant.toEpochMilli()可以用作唯一id吗?

Java Instant.toEpochMilli()可以用作唯一id吗?,java,uniqueidentifier,java.time.instant,Java,Uniqueidentifier,Java.time.instant,我必须生成一个唯一的Id,该Id也是可读的,因此不能使用UUID。所以我想到使用Instant.toEpochMilli()。它可以用作唯一id吗?否。我个人面临的情况是,两个对象具有相同的id。我已经测试了System.nanoTime(),它看起来不错,但一般情况下,两个变体都不正确 正确的解决方案: UUID.randomUUID() AtomicLong 数据库序列 否。我个人面临的情况是,两个对象具有相同的id。我测试了System.nanoTime(),它看起来正常,但一般情况下,

我必须生成一个唯一的Id,该Id也是可读的,因此不能使用UUID。所以我想到使用Instant.toEpochMilli()。它可以用作唯一id吗?

否。我个人面临的情况是,两个对象具有相同的id。我已经测试了
System.nanoTime()
,它看起来不错,但一般情况下,两个变体都不正确

正确的解决方案:

  • UUID.randomUUID()
  • AtomicLong
  • 数据库序列

否。我个人面临的情况是,两个对象具有相同的id。我测试了
System.nanoTime()
,它看起来正常,但一般情况下,两个变体都不正确

正确的解决方案:

  • UUID.randomUUID()
  • AtomicLong
  • 数据库序列
它可以用作唯一id吗

只有当您能够确定不会在同一毫秒内分配两个ID时,这似乎不太可能。毫秒对于人类来说是很短的时间,但对于计算机来说却不是很短的时间,一点也不是

如果您在给定的运行时环境中执行此操作,并且环境之间不必有唯一的ID,只需使用不断增加的ID即可(如果它只需要位于正在运行的进程内,则它可以是一个静态字段,您可以根据需要在某个位置递增;跨进程,但在相同的总体环境、数据库序列或类似环境中;等等)。如果它在环境之间必须是唯一的,则确实需要使用GUID或类似的

它可以用作唯一id吗

除非你能确定你不会在同一毫秒内分配两个ID,这似乎是不可能的。毫秒对人来说是很短的时间,但对计算机来说却不是很短的时间,一点也不是


如果您在给定的运行时环境中执行此操作,并且环境之间不必有唯一的ID,只需使用不断增加的ID即可(如果它只需要位于正在运行的流程中,那么它可以是一个静态字段,您可以根据需要在某个位置进行增量;跨流程,但在相同的总体环境、数据库序列或类似环境中;等等。)。如果它在不同环境之间必须是唯一的,则确实需要使用GUID或类似的GUID。

它以毫秒为单位生成当前时间。在大多数情况下,这还不够好。因为如果此方法的两次调用之间的超时时间太短(例如:在循环中调用时)它可能被复制。您可能想看看生成纳秒(例如System.nanoTime())。
总而言之,不鼓励使用毫秒甚至纳秒作为唯一id。但在某些特定的松散情况下,可以接受它。

它以毫秒为单位生成当前时间。在大多数情况下,这还不够好。因为如果此方法的两次调用之间的超时时间太短(例如:在循环中调用时)它可能被复制。您可能想看看生成纳秒(例如System.nanoTime())。
总而言之,不鼓励使用毫秒甚至纳秒作为唯一id。但在某些特定的松散情况下,可以接受。

只要您确定在一毫秒内没有创建两个或更多对象,那么可能……您必须为哪种对象创建id?如何使用
Instant.toEpochMilli
更多readab比UUID更简单?epoch milli如何比UUID更具可读性?如果您需要使用组和破折号以默认格式读取UUID,后者的打印效果会更好。除非您包装它以强制执行该约定,否则将永远无法保证它是唯一的,并且除非正确执行,否则仍可能导致多线程使用中出现问题UID并转换为字符串。UUID.randomUUID().toString()不要这样做-你不能绝对肯定你不会得到相同的ID-这取决于机器、系统、虚拟机的实现、温度等等。例如:你不知道用来获取时间的时钟分辨率。请参阅
系统的文档。currentTimeMillis
,它可能由
Inst使用ant
:“请注意,虽然返回值的时间单位为毫秒,但值的粒度取决于基础操作系统,可能更大。例如,许多操作系统以几十毫秒为单位测量时间。”只要你确定在一毫秒内没有创建两个或两个以上的对象,那么也许……对于什么类型的对象,你必须创建一个id?如何
即时。toEpochMilli
比UUID更可读?epoch milli如何比UUID更可读?如果你需要以默认格式用组和破折号。除非将其包装以强制执行该约定,否则将永远无法保证其唯一性,并且除非正确执行,否则仍可能导致多线程使用中出现问题。请改为使用随机UUID并转换为字符串。UUID.randomUUID().toString()不要这样做-你不能绝对肯定你不会得到相同的ID-这取决于机器、系统、虚拟机的实现、温度等等。例如:你不知道用来获取时间的时钟分辨率。请参阅
系统的文档。currentTimeMillis
,它可能由
Inst使用ant
:“请注意,虽然返回值的时间单位为毫秒,但值的粒度取决于底层操作系统,并且可能更大。例如,许多操作系统以几十毫秒为单位测量时间。”不确定
nanoTime
是否更好-javadoc:“该方法提供纳秒精度,但不一定是纳秒分辨率(即值变化的频率)-除了分辨率