UUID.randomUUID()vs SecureRandom

时间:2016-09-30 08:24:23

标签: java uuid secure-random

我试图理解在SecureRandom生成器上使用UUID.randomUUID()的优点,因为前者在内部使用securerandom。

4 个答案:

答案 0 :(得分:22)

好吧,source code节目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个非随机位,如果您挑剔可能会被视为不利。

答案 1 :(得分:6)

随机数随机重复。随机性越低(除非有一些协调),两次产生相同数字的机会就越大。

https://en.wikipedia.org/wiki/Birthday_problem
当你产生更多随机数时,重复相同数字的机会会增加,因为每个id必须与其他每个id不同。

SecureRandom允许您选择所需的随机性位数。使它太小,很有可能会重复。您可以在几分之一秒内获得重复的随机32位ID。

UUID将标准设置为128位(或者uoyilmaz指出,122位是随机的)这对于大多数用例来说已经足够了。但是,如果你想要一个随机的字符串,我会想要使用更多的位和/或更高的基数。例如Java支持基数36和64,这意味着你可以有更短的id,或者相同长度ID的随机性。

注意:UUID格式在其转储中有多个-,但我看不到它们的价值,只是让字符串更长。

答案 2 :(得分:-1)

感谢所有提供的技术解答。我自己对这两者之间的差异也感到困惑,这导致了我的到来。但是随后,我想到了一个想法:如果只调用一次函数,则没有区别,因为这两种方法都会生成无法预先计算的数字。但是,如果多次调用该函数,则它们在此处有所不同,因为统计正态分布是随机数生成器的属性,而这不是UUID的属性。 UUID致力于唯一性,实际上,它是使用计算机的MAC硬件地址,当前纪元秒等来得出提供的号码。最终,如果您循环调用UUID值,则该值将不会在统计上呈正态分布。

答案 3 :(得分:-2)

UUID不是随机数:它是通用唯一ID。您可以确定没有人可以生成相同的十六进制字符串。

随机数是另一个故事:它不是十六进制字符串,并且它不是普遍唯一的。

this library提供了一个更有效和完整的UUID生成器。