我正在查看一段代码,我可以看到下面这段代码生成了一个字符串,并将该字符串设置为表的主键。
return new BigInteger(UUID.randomUUID().toString().replaceAll("-", ""), 16).toString(36);
到目前为止,有很多记录,它们似乎都是唯一的,因为主键约束没有被违反。
我知道这个数字将是随机的,但它是否唯一呢?
谢谢。
Tuco
我正在查看一段代码,我可以看到下面这段代码生成了一个字符串,并将该字符串设置为表的主键。
return new BigInteger(UUID.randomUUID().toString().replaceAll("-", ""), 16).toString(36);
到目前为止,有很多记录,它们似乎都是唯一的,因为主键约束没有被违反。
我知道这个数字将是随机的,但它是否唯一呢?
谢谢。
Tuco
randomUUID
函数使用“密码学强伪随机数生成器”(来自 Javadoc)。这意味着在随机生成过程中有一些数学计算,以最小化碰撞(两个数字匹配)的风险。
不能 100% 保证数字完全唯一;但是,两个数字匹配的概率非常小,可以接受。
引自Michael Borgwardt的话:
UUID使用
java.security.SecureRandom
,它应该是“密码学强度”的。虽然实际实现没有指定,可以在JVM之间变化(这意味着任何具体的声明仅对一个特定的JVM有效),但它确实要求输出必须通过统计随机数生成器测试。
您也可以阅读java的UUID.randomUUID有多好?和UUID有多独特?获取更多信息。
UUID其实是全局唯一标识符。它被用于创建随机文件名、Web应用程序中的会话ID、事务ID以及替代序列或自动生成的数字来作为数据库记录的主键。