Java UUID压缩和解压缩

rb8*_*680 3 java uuid

我想做以下......

a)将生成的UUID压缩为长度为8的String.

b)将压缩的UUID解压缩回原始UUID.

原因是因为我必须将UUID发送到伙伴系统,并且伙伴系统只接受UUID的8个字符,并且我不能请求更改伙伴系统.

因此,剩下的工作是将我所拥有的UUID压缩为8个字符串,然后在从伙伴系统返回消息时将其解压缩回原始UUID.

有任何想法吗?

谢谢.

Mec*_*ail 8

出于信息理论的原因,你所要求的是不可能的.

RFC 4122指定的UUID 是128位,UUIDJava中的对象也是如此.

Java String可以为每个字符存储16位,这产生8个char字符串.但是,并非所有位序列都是有效的UTF-16字符串,因此在8个字符中,您可以存储少于128位的信息.

因此,如果将UUID压缩为有效的8个字符的字符串,则会丢失信息,因此通常无法将其解压缩以检索原始UUID.

您可能想要的是生成一个较短的字符串以用作唯一标识符.如果是,请参阅生成仅8个字符的UUID.


xjo*_*oin 5

实现 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==