2017-05-25 139 views
0

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

+3

你问一个22字符的字符串使用多少个字节? – VGR

+0

是的,那正是我的问题。 36个字符表示128位。 22chachars怎么样? –

+0

提供这样的文章的例子可能有助于理解你的意思 – Andremoniy

回答

1

GUID在功能上非常类似于UUID。它是一个16字节(128位)值。 Java的UUID类使用两个8字节的long,因为这是Java最大的基本类型。如果base-64对long进行编码,您将获得22到24个字符,具体取决于是否填充ba​​se-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的基64编码的字符串时,22个字符将被转换为ASCII,然后将占用22个字节,每个ASCII字符一个。

+0

或者,而不是字符串和base-64,将UUID作为[原生UUID类型](https://www.postgresql.org/docs/current/static/datatype-uuid.html)存储在数据库中128位(16个八比特组/字节)。 –

+0

是的,如果您使用的是数据库,并且它具有本机UUID类型,而不是将它们存储为字符串。 – ngreen