gpt4 book ai didi

java - 在Java中将UUID编码为15个字符的字符串

转载 作者:太空宇宙 更新时间:2023-11-04 14:17:15 25 4
gpt4 key购买 nike

我在这里看到了几个类似的问题,但没有一个完全符合我的需要。由于无法更改的原因,我需要获取 java UUID 并将其存储在 15 个字符长的字符串中。我发现的所有基本方法的数字更改只能将其减少到最多 22 个字符,但我认为应该可以使其更短。有谁知道如何做到这一点?绳子越短越好。谢谢!

最佳答案

UUID 由 128 位组成。它可以存储在 15 个字符的 java 字符串中,因为 java 字符是 16 位,包含 UTF-16 字符。并非所有 16 位值都可以采用,对于更高的 Unicode 值,某些字符必须成对出现。但我们只需要每个字符 9 位有效负载(15 个字符 * 9 位有效负载 >= 128 位)。

因此,我们可以为每个字符存储 9 位有效负载,例如从 U+2000 开始。

public static String uuidToStr15(UUID uuid) {
long[] longs = new long[2];
longs[0] = uuid.getLeastSignificantBits();
longs[1] = uuid.getMostSignificantBits();
System.out.println("uuidToStr15: " + Arrays.toString(longs));

char[] chars = new char[15];
// 15 chars x 9 bits payload == 135 >= 128.
final int bitsPerChar = (128 + chars.length - 1) / chars.length;
final int char0 = 0x2000;
long mask = (1L << bitsPerChar) - 1;
for (int i = 0; i < chars.length; ++i) {
int payload = (int)(longs[0] & mask);
chars[i] = (char)(char0 + payload);
longs[0] >>>= bitsPerChar;
longs[0] |= (longs[1] & mask) << (64 - bitsPerChar);
longs[1] >>>= bitsPerChar;
}
return new String(chars);
}

public static UUID str15ToUuid(String s) {
char[] chars = s.toCharArray();
if (chars.length != 15) {
throw new IllegalArgumentException(
"String should have length 15, not " + chars.length);
}
final int bitsPerChar = (128 + chars.length - 1) / chars.length;
final int char0 = 0x2000;
long mask = (1L << bitsPerChar) - 1;
long[] longs = new long[2];
//for (int i = 0; i < chars.length; ++i) {
for (int i = chars.length - 1; i >= 0; --i) {
int payload = (int) chars[i];
if (payload < char0) {
throw new IllegalArgumentException(
String.format("Char [%d] is wrong; U+%04X",
i, payload));
}
payload -= char0;
longs[1] <<= bitsPerChar;
longs[1] |= (longs[0] >>> (64 - bitsPerChar)) & mask;
longs[0] <<= bitsPerChar;
longs[0] |= payload;
}
System.out.println("str15ToUuid: " + Arrays.toString(longs));
return new UUID(longs[1], longs[0]);
}

public static void main(String[] args) {
UUID uuid = UUID.randomUUID();
System.out.println("UUID; " + uuid.toString());
String s = uuidToStr15(uuid);
UUID uuid2 = str15ToUuid(s);
System.out.println("Success: " + uuid2.equals(uuid));
}

当然,这些字符串不容易写下来或在键盘上输入。为此,需要更加小心,并选择 Unicode 代码点的范围。

此外,“15 个字符”在 UTF-16 中正好是 30 个字节,但在 UTF-8 中将具有更长的物理大小。

关于java - 在Java中将UUID编码为15个字符的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27572410/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com