128位(16字节)GUID被压缩到多少位或字节?

时间:2017-05-25 14:25:18

标签: java database compression uuid guid

许多在线文章都在讨论使用base64从36个字符到22个字符的GUID压缩。我想知道有多少字节或位代表压缩的GUID(22字符)? GUID看起来像这样的c9a646d3-9c61-4cb7-bfcd-ee2522c8f633 - 这是32个十六进制数字,每个数字编码4位,所以总共128位。 base64编码每个符号使用6位,使用URL安全字符很容易实现22字符编码字符串。 有多少位代表这些22char?

1 个答案:

答案 0 :(得分:1)

GUID在功能上与UUID非常相似。它是一个16字节(128位)的值。 Java的UUID类使用两个8字节long,因为这是Java最大的基本类型。如果你对long进行base-64编码,你将获得22到24个字符,具体取决于是否填充了base-64编码。以下是一些示例代码,可帮助您了解其工作原理:

UUID uuid = UUID.randomUUID();
ByteBuffer buf = ByteBuffer.allocate(16);
buf.asLongBuffer()
        .put(uuid.getMostSignificantBits())
        .put(uuid.getLeastSignificantBits());
String base64Uuid = Base64.getEncoder()
        .withoutPadding()
        .encodeToString(buf.array());

22个字符实际上将在Java中使用44个字节,因为Java的char是16位。您还有char[]数组本身的开销和String类的开销,所以它甚至更多。 (大约40个字节,但具体数量取决于您的JVM实现。)

如果您最终在URL中使用base-64编码的字符串,则22个字符将转换为ASCII,然后将占用22个字节,每个ASCII字符一个。