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