Java中通过UUID生成唯一数字?

4

我正在查看一段代码,我可以看到下面这段代码生成了一个字符串,并将该字符串设置为表的主键。

return new BigInteger(UUID.randomUUID().toString().replaceAll("-", ""), 16).toString(36);

到目前为止,有很多记录,它们似乎都是唯一的,因为主键约束没有被违反。

我知道这个数字将是随机的,但它是否唯一呢?

谢谢。

Tuco


旁边的问题:既然你已经将字符串作为主键使用了,为什么不使用UUID.randomUUID().toString()呢?这样数据库的其他用户就知道主键是UUID了。 - nd.
引用自维基百科(http://en.wikipedia.org/wiki/Universally_unique_identifier): 换句话说,即使在未来的100年里每秒生成10亿个UUID,仅创建一个重复的概率也只有约50%。 - MaVRoSCy
我忘了提到代码已经就位并且正在生产中,目前运行良好。 - Tuco
4个回答

4

不能保证生成的数字是唯一的,但由于范围非常大,几乎不可能生成重复的数字。

即使考虑到生日悖论,概率也极低。


1

randomUUID 函数使用“密码学强伪随机数生成器”(来自 Javadoc)。这意味着在随机生成过程中有一些数学计算,以最小化碰撞(两个数字匹配)的风险。

不能 100% 保证数字完全唯一;但是,两个数字匹配的概率非常小,可以接受。


1

引自Michael Borgwardt的话:

UUID使用java.security.SecureRandom,它应该是“密码学强度”的。虽然实际实现没有指定,可以在JVM之间变化(这意味着任何具体的声明仅对一个特定的JVM有效),但它确实要求输出必须通过统计随机数生成器测试。

您也可以阅读java的UUID.randomUUID有多好?UUID有多独特?获取更多信息。


0

UUID其实是全局唯一标识符。它被用于创建随机文件名、Web应用程序中的会话ID、事务ID以及替代序列或自动生成的数字来作为数据库记录的主键。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接