我想生成唯一的 Id 作为多个物理上分离的数据库的键。
我使用 JBoss,我想知道哪个实现/库是要走的路。我知道java.util.UUID
会很简单,而且可能没问题。我只是想知道这是否是 JBoss 中要走的路。
有什么提示吗?
看起来 JBoss 中有一个 UUID 生成器可以使用以下代码调用:
InitialContext ctx = new InitialContext();
KeyGeneratorFactory kgf = (KeyGeneratorFactory) ctx.lookup("UUIDKeyGeneratorFactory");
KeyGenerator kg = kgf.getKeyGenerator();
Object uuid = kg.generateKey();
推荐是什么意思?
UUID 是一个标准。有不同种类的UUID(也被定义为标准(。使用哪个库或实现并不重要,只要生成的密钥遵循标准(在其他情况下,只要它有效(。
我认为UUID的JDK实现非常可靠。它是Java API的一部分,很简单,我认为没有理由不使用它。事实上,这就是我在 EJB 3.0 应用程序(在 JBoss 上运行(中使用的。
JBoss AS 提供的 UUID 生成器是在 3.2 版本中添加的(根据另一个答案中的链接(。包含这个生成器可能是因为当 JBoss 3.2 发布时,JDK 没有提供 Java 5 中引入的 java.util.UUID
类。
Andre Rodrigues的回答是正确的。
您应该研究UUID的版本(类型(。维基百科页面在解释方面做得很好。
java.util.UUID 类只生成版本 3(基于名称,通过方法 nameUUIDFromBytes(byte[] name)
(和第 4(完全随机,通过方法 randomUUID()
(UUID。Sun/Oracle声称他们提供了一个"加密强大的伪随机数生成器"。这意味着即使创造了数十亿或数万亿个价值,你也不应该有任何真正的碰撞机会。
出于安全原因,Java 不会生成使用网络接口的 MAC 地址和当前日期时间的原始版本。从理论上讲,这个版本比版本 4 发生冲突的可能性更小。事实上,碰撞几乎是不可能的。如果这是您想要的 UUID,您可以通过调用另一个库来创建一个。如今,大多数操作系统都捆绑了UUID生成器,例如BSD和OS X中的uuidgen。然后将位或十六进制字符串传递给 java.util.UUID 上的构造函数或工厂方法之一。