我想做以下......
a)将生成的UUID压缩为长度为8的String.
b)将压缩的UUID解压缩回原始UUID.
原因是因为我必须将UUID发送到伙伴系统,并且伙伴系统只接受UUID的8个字符,并且我不能请求更改伙伴系统.
因此,剩下的工作是将我所拥有的UUID压缩为8个字符串,然后在从伙伴系统返回消息时将其解压缩回原始UUID.
有任何想法吗?
谢谢.
出于信息理论的原因,你所要求的是不可能的.
RFC 4122指定的UUID 是128位,UUIDJava中的对象也是如此.
Java String可以为每个字符存储16位,这将产生8个char字符串.但是,并非所有位序列都是有效的UTF-16字符串,因此在8个字符中,您可以存储少于128位的信息.
因此,如果将UUID压缩为有效的8个字符的字符串,则会丢失信息,因此通常无法将其解压缩以检索原始UUID.
您可能想要的是生成一个较短的字符串以用作唯一标识符.如果是,请参阅生成仅8个字符的UUID.
实现 url 安全 uuid 压缩的最佳方法是将其编码为 base64
public class UUIDUtils {
public static String compress(UUID uuid) {
ByteBuffer bb = ByteBuffer.allocate(Long.BYTES * 2);
bb.putLong(uuid.getMostSignificantBits());
bb.putLong(uuid.getLeastSignificantBits());
byte[] array = bb.array();
return Base64.getEncoder().encodeToString(array);
}
public static UUID decompress(String compressUUID) {
ByteBuffer byteBuffer = ByteBuffer.wrap(Base64.getDecoder().decode(compressUUID));
return new UUID(byteBuffer.getLong(), byteBuffer.getLong());
}
}
Run Code Online (Sandbox Code Playgroud)
结果:6227185c-b25b-4497-b821-ba4f8d1fb9a1 -> YicYXLJbRJe4IbpPjR+5oQ==