我正在查看一段代码,我可以看到已经编写了以下代码,它生成了一个字符串,并且该字符串已被设置为表的主键。
return new BigInteger(UUID.randomUUID().toString().replaceAll("-", ""), 16).toString(36);
到目前为止,有很多记录,并且它们似乎是唯一的,因为没有违反主键约束。
我知道这个数字是随机的,但它会是唯一的吗?
谢谢
图科
无法保证这些数字是唯一的,但是由于范围如此之大,因此极不可能生成重复的数字。
即使考虑到生日悖论,这个机会也非常低。
引用迈克尔·博格沃特的话
UUID 使用
java.security.SecureRandom
,它应该是“加密强”。虽然未指定实际实现并且在 JVM 之间可能会有所不同(这意味着所做的任何具体语句仅对一个特定的 JVM 有效),但它确实要求输出必须通过统计随机数生成器测试。
您还可以阅读java 的 UUID.randomUUID 有多好?UUID有多独特?了解更多信息
该randomUUID
函数使用“加密强伪随机数生成器”(来自 Javadoc)。这意味着随机生成背后有一些数学运算可以最大限度地降低碰撞风险(两个数字匹配)。
不能 100% 保证这些数字是完全唯一的;但是,两个数字匹配的可能性很小。
UUID 实际上是通用唯一标识符。它的一些用途是用于创建随机文件名、Web 应用程序中的会话 ID、事务 ID 以及用于替换序列或自动生成的数字的数据库中记录的主键。