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

问题描述 投票:0回答:7

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

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

但是生成的uuid太长了,长度是36

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

java uuid
7个回答
36
投票

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

例如,你可以这样做。

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);

这会给你几乎相同程度的随机性,但会使用

\u0000
\ufffd

之间的每个可能的字符

如果你需要可打印的 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 个字符。

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

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


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

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

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


1
投票

将它从 base 16(0-9,A-F) 转换为 base 36(0-9,A-Z).. 你可以转到 base 62 (0-9, A-Z, a-z) 但是如果你需要通过电话阅读它或其他东西,这很容易出错。 https://github.com/salieri/uuid-encoder 是一个可能适合您的库...

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


0
投票

您可以使用

${__time()}
函数进行评估


0
投票

以下片段是动态 UUID 代码。默认情况下,UUID 的长度取决于位,但函数从 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);
  }

0
投票

生成uuid时可以使用substring的方法来减少字符串长度

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

-2
投票

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

public static String shortUUID() {
  UUID uuid = UUID.randomUUID();
  long l = ByteBuffer.wrap(uuid.toString().getBytes()).getLong();
  return Long.toString(l, Character.MAX_RADIX);
}
© www.soinside.com 2019 - 2024. All rights reserved.