Instant.toEpochMilli() 可以用作唯一标识吗?
Can Instant.toEpochMilli() be used as a unique id?
我必须生成一个可读的唯一 ID,因此不能使用 UUID。所以我想到了使用Instant.toEpochMilli()。可以作为唯一id吗?
没有。 我个人遇到过两个对象具有相同 ID 的情况。我已经测试了 System.nanoTime()
,它看起来不错,但在一般情况下,两种变体都不正确。
正确答案:
UUID.randomUUID()
AtomicLong
- 数据库序列
Can it be used as unique id?
只有当您可以确定您不会在同一毫秒内分配两个 ID 时,这似乎不太可能。毫秒对于人类来说确实是很短的时间,但对于计算机来说不是短暂的时间,根本不是。
如果您在给定的运行时环境中执行此操作并且不必在 环境之间具有唯一 ID,只需使用一个不断增加的数字(如果仅需要在 运行 进程中,这可以只是一个静态字段,你可以根据需要在某个地方增加;跨进程但在相同的整体环境、数据库序列或类似环境中;等等)。如果它必须在环境之间是唯一的,你确实需要使用 GUID 或类似的。
它以毫秒为单位生成当前时间。好吧,在大多数情况下,它还不够好。因为如果此方法的两次调用之间的超时时间太短(例如:当您在循环中调用它时),它可能会重复。您可能想看看生成纳秒(例如 System.nanoTime())。
综上所述,不鼓励使用毫秒甚至纳秒作为唯一标识。但是在一些特别松散的情况下,是可以接受的。
我必须生成一个可读的唯一 ID,因此不能使用 UUID。所以我想到了使用Instant.toEpochMilli()。可以作为唯一id吗?
没有。 我个人遇到过两个对象具有相同 ID 的情况。我已经测试了 System.nanoTime()
,它看起来不错,但在一般情况下,两种变体都不正确。
正确答案:
UUID.randomUUID()
AtomicLong
- 数据库序列
Can it be used as unique id?
只有当您可以确定您不会在同一毫秒内分配两个 ID 时,这似乎不太可能。毫秒对于人类来说确实是很短的时间,但对于计算机来说不是短暂的时间,根本不是。
如果您在给定的运行时环境中执行此操作并且不必在 环境之间具有唯一 ID,只需使用一个不断增加的数字(如果仅需要在 运行 进程中,这可以只是一个静态字段,你可以根据需要在某个地方增加;跨进程但在相同的整体环境、数据库序列或类似环境中;等等)。如果它必须在环境之间是唯一的,你确实需要使用 GUID 或类似的。
它以毫秒为单位生成当前时间。好吧,在大多数情况下,它还不够好。因为如果此方法的两次调用之间的超时时间太短(例如:当您在循环中调用它时),它可能会重复。您可能想看看生成纳秒(例如 System.nanoTime())。 综上所述,不鼓励使用毫秒甚至纳秒作为唯一标识。但是在一些特别松散的情况下,是可以接受的。