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

时间:2011-02-03 00:12:17

标签: java time uniqueidentifier

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

这是一个安全的假设吗?

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

1296691225227

3 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:10)

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

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

我强烈建议改用它。

答案 2 :(得分:0)

如果您的代码在群集环境中运行,则会增加您发生ID冲突的几率。

大多数JPA数据库都有自行生成唯一ID的方法。

http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing