在Java中生成全局唯一标识符

我正在开发一个持久性Java Web应用程序,并且我需要确保持久化的所有资源都具有全局唯一标识符,以防止重复。

  1. 我没有使用RDBMS,所以没有任何特殊的序列生成器(例如Oracle提供的序列生成器)
  2. 我希望它速度很快,最好是全部在内存中-我宁愿不必打开文件并增加一些值
  3. 它必须是线程安全的(我预计一次只需要一个JVM即可生成ID)
  4. JVM的各个实例之间必须具有一致性。如果服务器关闭并启动,则ID生成器不应重新生成其与先前实例化中生成的ID相同的ID(或至少机会必须非常非常小-我预计会有数百万个现有资源)
  5. 我在EJB唯一ID模式文章中看到了示例。它们对我不起作用(我宁愿不完全依赖System.currentTimeMillis(),因为我们将每毫秒持久存储多个资源)。
  6. 我已经看过这个问题提出的答案。我对它们的担心是,随着时间的流逝,我有什么机会获得重复的ID?我对将java.util.UUID用作UUID的建议很感兴趣,但同样,重复的机会必须非常小。
  7. 我正在使用JDK6

回答:

可以肯定的是,UUID是“足够好”的。有340,282,366,920,938,463,463,374,607,431,770,000,000个UUID可用。

http://www.wilybeagle.com/guid_store/guid_explain.htm

“从这些数字来看,一个人每年被陨石撞击的风险估计为170亿次机会,这意味着该概率约为0.00000000006(6×10−11),等于产生几率的几率一年内有数十万亿个UUID,并且有一个重复项,也就是说,只有在接下来的100年中每秒生成10亿个UUID之后,才创建一个重复项的可能性约为50%。如果地球上每个人都拥有6亿个UUID,则大约为50%”

http://en.wikipedia.org/wiki/Universally_Unique_Identifier

以上是 在Java中生成全局唯一标识符 的全部内容, 来源链接: utcz.com/qa/415676.html

回到顶部