2017-05-25 171 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