Answers:
根据文档,静态方法UUID.randomUUID()
生成类型4 UUID。
这意味着六位用于某种类型信息,其余的122位是随机分配的。
分布了六个非随机位,其中UUID的最高有效一半分配了四个,而最低有效一半分配了两个。因此,您UUID的最重要的一半包含60位随机性,这意味着您平均需要生成2 ^ 30个UUID才能发生冲突(相比之下,完整UUID则为2 ^ 61)。
所以我说你很安全。但是请注意,正如Carl Seleborg提到的,对于其他类型的UUID绝对不是这样。
顺便说一句,通过使用UUID的最低有效部分(或仅使用SecureRandom生成随机长整型),您的情况会更好一些。
我认为这是使用randomUUID的最佳示例:
使用时间YYYYDDDD
(年份+一年中的天)作为前缀。这减少了表和索引中的数据库碎片。此方法返回byte[40]
。我在混合环境中使用了该环境,其中Active Directory SID(varbinary(85)
)是LDAP用户的密钥,而应用程序自动生成的ID用于非LDAP用户。同样,每天交易表(银行业)中的大量交易不能使用标准Int
类型的密钥
private static final DecimalFormat timeFormat4 = new DecimalFormat("0000;0000");
public static byte[] getSidWithCalendar() {
Calendar cal = Calendar.getInstance();
String val = String.valueOf(cal.get(Calendar.YEAR));
val += timeFormat4.format(cal.get(Calendar.DAY_OF_YEAR));
val += UUID.randomUUID().toString().replaceAll("-", "");
return val.getBytes();
}