安全使用System.currentTimeMillis()生成唯一的数据库ID?

Sil*_*ing 10 java time uniqueidentifier

我在Java中使用System.currentTimeMillis()(返回一个long整数)来为数据库实体生成一个唯一的ID,因为我认为这些时间在任何时候都不可能重叠.

这是一个安全的假设吗?

例如,目前我得到了这个:

1296691225227
Run Code Online (Sandbox Code Playgroud)

tem*_*def 16

不,这不安全.一个毫秒是CPU周期中的长时间(它们以每秒数十亿个周期运行,而不是数千个),因此如果一次有多个请求进入,或者如果多个线程都尝试创建数据库条目,则它们将看到相同的CPU时间和将以碰撞键结束.如果系统时钟以某种方式重置或更改为较早时间,您也会遇到麻烦.

  • 另外值得注意的是,虽然毫秒计时器的*minimum*粒度理论上是1ms,但实际粒度可能更大.我使用的系统是20ms. (5认同)

ska*_*man 10

你不太可能发生冲突,是的(除非你处于高负荷系统,在这种情况下可能),但仍有可能.

但是,Java有一种生成唯一标识符的现有机制 - java.util.UUID.它有生成随机ID的方法.

我强烈建议使用它.