Base58編碼的長度是如何計算的?

yzf01發表於2021-09-09


base58 是由中本聰為bitcoin設計的。

相比與base64的字元,他將一些直觀看來模糊的字元去除了。

字元共58個

  • 1-9 共9個

  • 大寫字母A-Z(不包括O、I),共24個

  • 小寫字母a-z (不包括l),共25個

在一些base58的實現程式碼中,我們往往需要為生成的編碼後的字串預留空間,這是如何計算的呢?

例如一段原始碼及註釋:

std::vector b58((pend - pbegin) * 138 / 100 + 1); 
// log(256) / log(58), rounded up

這個公式看起來有點讓人摸不著頭腦,但經過一些思考,我想明白了。

在編碼後的字串中,每一個字元都是從58個字元中當中選擇出來的。那麼這58種不同的資訊可以用多少bit來代替呢?顯然答案是log(2)58。換句話說,每一個字母代表的資訊量是log(2)58 bit。

我們輸入的位元組流資訊量是固定的:(byte_length * 8)bit

那麼,需要預留的字元數量就是(byte_length * 8)/ log258

經過換算,

(byte_length * 8)/ log258 =
(byte_length * log2256) / log258 =
byte_length * 1.38

最後,還需要加向上取整

最終結果就是 byte_length * 1.37 + 1


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2334/viewspace-2809189/,如需轉載,請註明出處,否則將追究法律責任。

相關文章