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

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

这是一个安全的假设吗?

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

 1296691225227 

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

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

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

我强烈建议改用它。

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

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

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