我想了解使用UUID.randomUUID()相比SecureRandom生成器的优势,因为前者在内部使用securerandom。
我想了解使用UUID.randomUUID()相比SecureRandom生成器的优势,因为前者在内部使用securerandom。
好的,源代码 显示UUID.randomUUID
使用SecureRandom
。
public static UUID [More ...] randomUUID() {
SecureRandom ng = numberGenerator;
if (ng == null) {
numberGenerator = ng = new SecureRandom();
}
byte[] randomBytes = new byte[16];
ng.nextBytes(randomBytes);
randomBytes[6] &= 0x0f; /* clear version */
randomBytes[6] |= 0x40; /* set to version 4 */
randomBytes[8] &= 0x3f; /* clear variant */
randomBytes[8] |= 0x80; /* set to IETF variant */
return new UUID(randomBytes);
}
正如您所看到的,您可以使用任何一个UUID版本,但在安全UUID中,您有6个非随机位,如果您很挑剔,这可能被认为是一个劣势。
随机数有被重复生成的随机机会。如果随机性较低(除非存在某种协调),则生成相同数字的概率就越大。
https://en.wikipedia.org/wiki/Birthday_problem
随着生成更多的随机数,出现相同数字的概率也会增加,因为每个 ID 都必须与其他所有 ID 不同。
SecureRandom 允许您选择需要多少位的随机性。如果太小,则有很大的可能性会出现重复。您可以在短短几秒钟内获得重复的 32 位随机 ID。
UUID 在 128 位(或如 uoyilmaz 指出的,122 位是随机的)上设置标准。这已经足够满足大多数使用情况。但是,如果您想要一个随机字符串,我会建议使用更多位和/或更高的进制,例如 Java 支持 36 和 64 进制,这意味着您可以拥有更短的 ID 或者相同长度的 ID 可以拥有更多的随机性。
注意:UUID 格式中有多个 -
,虽然我不清楚它们的价值,但它们只会使字符串变长。
randomUUID
生成类型4的UUID。 - Jules
UUID.randomUUID()
。 如果你需要其他形式的随机性,请直接使用SecureRandom
。 - Andy TurnerSecureRandom
是一个随机数生成器。UUID.randomUUID()
生成一个UUID
,这不仅仅是一个随机数。 - Jesper