0

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

4

3 回答 3

5

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

正确解决方案:

  • UUID.randomUUID()
  • AtomicLong
  • 数据库序列
于 2018-09-26T09:42:48.930 回答
0

它可以用作唯一ID吗?

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

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

于 2018-09-26T09:42:50.950 回答
0

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

于 2018-09-26T09:46:40.953 回答