繁体   English   中英

如何减少使用 randomUUID( ) 生成的 UUID 的长度

[英]how to reduce length of UUID generated using randomUUID( )

我有一个简短的实用程序,我在其中使用 randomUUID() 生成一个 UUID。

String uuid = UUID.randomUUID().toString();

但是,生成的 uuid 太长,长度为 36。

有什么办法可以将 UUID 的长度从 36 减少到接近 16 或使 UUID 长度动态化?

如果你不需要它是独一无二的,你可以使用任何你喜欢的长度。

例如,您可以这样做。

Random rand = new Random();
char[] chars = new char[16];
for(int i=0;i<chars.length;i++) {
    chars[i] = (char) rand.nextInt(65536);
    if (!Character.isValidCodePoint(chars[i]))
        i--;
}
String s = new String(chars);

这将为您提供几乎相同程度的随机性,但将使用\\�之间的每个可能的字符

如果您需要可打印的 ASCII 字符,您可以让它尽可能短,但唯一性的可能性会显着下降。 可以做的是使用 base 36 而不是 base 16

UUID uuid = UUID.randomUUID();
String s = Long.toString(uuid.getMostSignificantBits(), 36) + '-' + Long.toString(uuid.getLeastSignificantBits(), 36);

这将平均 26 个字符,最多 27 个字符。

您可以使用 base64 编码并将其减少到 22 个字符。

如果您使用 base94,您可以获得 20 个字符。

如果您使用从 \ 到 \� 的整个有效字符范围,您可以将其减少到仅 9 个字符或 17 个字节。

如果您不关心字符串,则可以使用 16 位 8 位字节。

您可以使用 substring 方法在生成 uuid 时减少字符串长度。

UUID.randomUUID().toString().substring(0, 5)

String uuid = String.format("%040d", new BigInteger(UUID.randomUUID().toString().replace("-", ""), 16));

String uuid16digits = uuid.substring(uuid.length() - 16);

这将返回实际 uuid 的最后 16 位数字。

您可以使用${__time()}函数进行评估

将它从基数 16(0-9,AF) 转换为基数 36(0-9,AZ)。您可以转到基数 62 (0-9, AZ, az) 但如果您需要通过电话或那么这可能容易出错。 https://github.com/salieri/uuid-encoder是一个可能对你有用的库......

这也意味着你仍然有一个 GUID - 你没有像其他答案那样截断它

以下片段是动态 UUID 代码。 默认情况下,UUID 的长度取决于位,但 function 从 UUID 中随机选择字符

 public String myUUID(int length) {
    String allChars = UUID.randomUUID().toString().replace("-", "");
    Random random = new Random();
    char[] otp = new char[length];
    for (int i = 0; i < length; i++) {
      otp[i] =
          allChars.charAt(random.nextInt(allChars.length()));
    }
    return String.valueOf(otp);
  }

是的,您可以使用此功能创建。

public static String shortUUID() {
  UUID uuid = UUID.randomUUID();
  long l = ByteBuffer.wrap(uuid.toString().getBytes()).getLong();
  return Long.toString(l, Character.MAX_RADIX);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM