簡體   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