UUID.randomUUID()vs SecureRandom

Use*_*958 13 java uuid secure-random

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

uoy*_*maz 24

好吧,源代码显示了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);
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,您可以使用其中任何一种,但在安全的UUID中,您有6个非随机位,如果您挑剔可能会被视为劣势.

  • 是的,你可以这样做.但是,如果你想将它用作UUID,我建议使用randomUUID.这6位符合UUID规范,并且很高兴遵守规范:https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29 (3认同)
  • 是的,所以如果我想生成唯一的 ID,我可以使用 SecureRandom 本身来做到这一点,对吗?这与获取类型 4 UUID 一样好。但也许我可以生成随机填充位数多于 122 位的唯一 ID。这是正确的吗? (2认同)
  • 私有构造函数UUID(byte [] arr)不会对随机生成的字节数组执行任何操作,以更改其值! (2认同)

Pet*_*rey 6

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

https://en.wikipedia.org/wiki/Birthday_problem
随着您生成更多随机数,重复相同数字的可能性会增加,因为每个ID必须与其他每个ID不同.

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

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

注意:UUID格式-在其转储中有多个,虽然我没有看到它们的值,但它们只是使字符串更长.

  • 破折号仅用于人类可读性;如果你没有看到它们的使用,你可能是一个半机械人:P (2认同)
  • 破折号使人类读者更容易识别布局中的记录:https://en.wikipedia.org/wiki/Universally_unique_identifier (2认同)

san*_*k78 -4

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

随机数则是另一回事:它不是十六进制字符串,也不是普遍唯一的。

该库提供了更高效、更完整的 UUID 生成器。

  • “你可以确定没有人可以生成相同的十六进制字符串。” - 这可能会产生误导:您_可以_生成相同的 uuid,但如果您遵循规则,则不太可能发生这种情况。 (13认同)
  • 理论上可能会发生冲突,但概率非常低:https://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates (2认同)