UUID.randomUUID() vs SecureRandom
2022-09-01 20:12:53
我试图理解使用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中,您有6个非随机位,如果您挑剔,这可以被认为是一个缺点。
随机数有重复的随机机会。随机性越低(除非有某种协调),产生相同数字两次的机会就越大。
https://en.wikipedia.org/wiki/Birthday_problem
当您生成更多的随机数时,重复相同数字的几率会增加,因为每个id必须与每个其他id不同。
SecureRandom允许您选择所需的随机性。让它太小,它们很有可能会被重复。您可以在几分之一秒内获得重复的随机32位ID。
UUID将标准设置为128位(或者正如uoyilmaz指出的那样,122位是随机的)这对于大多数用例来说已经足够了。但是,如果你想要一个随机的字符串,我会忍不住使用比16更多的位和/或更高的基数。例如,Java支持基数36和64,这意味着您可以具有较短的ID,或者对于相同长度的ID具有更高的随机性。
注意:UUID格式在它的转储中有多个,尽管我没有看到它们的值,但它们只会使字符串更长。-