密碼學:https://chaindesk.cn/witbook/15
哈希值的輸出值一般是16進制的字符串。
而16進制字符串,每兩個字符佔一個字節。
一個字節 = 8bit
SHA256
無論輸入多長,都輸出 64 個字符,共32字節(byte),256位(bit)
輸出只包含數字0~9和字母A~F,大小寫不敏感
https://play.golang.org/p/Mm1-YK0KhE8
RIPEMD160
無論輸入多長,都輸出 40 個字符,共20字節(byte),160位(bit)
https://play.golang.org/p/v72c3ms4PcP
Base64, Base32 和 Base16:
https://studygolang.com/articles/10799
https://zhuanlan.zhihu.com/p/51316306
BASE16 = "0123456789ABCDEF"
BASE32 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"
BASE32_HEX = "0123456789ABCDEFGHIJKLMNOPQRSTUV"
BASE64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
BASE64_URL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
計算機中,存儲的的二進制碼,是一個字節(8位)一組。 Base 系列編碼,本質上就是將字節切片組合,然後為重組後的數字找一個對應的、可見的 ASCII 字符,這就是 Base 系列編碼了。
base 系列編碼並不屬於字符編碼,他們主要用於把一串「無意義的」八位二進製字節編碼為可見 ASCII 字符。 base64 大概浪費了 25% 的空間,base32 是 37.5%,base16 是 50%。
「無意義」是指 base 編碼可編碼任意二進制而無需知道其意義。
反思:如果從節省空間的角度考慮,為什麼不用 base128 呢?
Base32 將任意字符串按照字節進行切分,並將每個字節對應的二進制值(不足8bits高位補0)串聯起來,按照5bits一組進行切分,並將每組二進制值轉換成十進制來對應32個可打印字符中的一個。
由於數據的二進制傳輸是按照8bit一組進行(即一個字節),因此Base32按5bits切分的二進制數據必須是40bits的倍數(5和8的最小公倍數)。例如輸入單字節字符“%”,它對應的二進制值是“100101”,前面補兩個0變成“00100101”(二進制值不足8bits的都要在高位加0直到8bits),從左側開始按照5比特切分成兩組:“00100”和“101”,後一組不足5比特,則在末尾填充0直到5比特,變成“00100”和“10100”,這兩組二進制數分別轉換成十進制數,通過上述表格即可找到其對應的可打印字符“E”和“U”,但是這裡只用到兩組共10比特,還差30比特達到40比特,按照5比特一組還需6組,則在末尾填充6個“=”。
填充“=”符號的作用是方便一些程序的標準化運行,大多數情況下不添加也無關緊要,而且,在URL中使用時必須去掉“=”符號。
與Base64相比,Base32具有許多優點:
適合不區分大小寫的文件系統,更利於人類口語交流或記憶。
結果可以用作文件名,因為它不包含路徑分隔符 “/”等符號。
排除了視覺上容易混淆的字符,因此可以準確的人工錄入。 (例如,RFC4648符號集忽略了數字“1”、“8”和“0”,因為它們可能與字母“I”,“B”和“O”混淆)。
排除填充符號“=”的結果可以包含在URL中,而不編碼任何字符。
Base32也比Base16有優勢:
Base32比Base16佔用的空間更小。 (1000比特數據Base32需要200個字符,而Base16則為250個字符)
Base32的缺點:
Base32比Base64多佔用大約20%的空間。因為Base32使用8個ASCII字符去編碼原數據中的5個字節數據,而Base64是使用4個ASCII字符去編碼原數據中的3個字節數據。
https://play.golang.org/p/_OP_RqjYyHh
hex也稱為base16,意思是使用16個可見字符來表示一個二進制數組,編碼後數據大小將翻倍,因為1個字符需要用2個可見字符來表示。
base32,意思是使用32個可見字符來表示一個二進制數組,編碼後數據大小變成原來的8/5,也即5個字符用8個可見字符表示,但是最後如果不足8個字符,將用=來補充。
base64,意思是使用64個可見字符來表示一個二進制數組,編碼後數據大小變成原來的4/3,也即3個字符用4個可見字符來表示。
為何要把"hello world!" 這麼明白的東西變成一串看不懂的東西,其實是這個例子使用了可見字符而已,而有很多字符是不可見的,我們需要把這些不可見字符變成可見字符。
那為何要變成可見字符?你是看著亂碼舒服還是看著可見字符舒服呢?其實不僅僅舒不舒服的問題,有些時候還必須要用可見字符,例如在網絡中傳輸數據時,不同路由器對於不可見字符的處理是不同的,因此可能出現數據錯誤,因此還必須使用可見字符。
hex, base32, base64 的區別主要就是空間效率的區別,base64是具有比較高的空間效率的。
hex編碼不區分大小寫,但是base32與base64是區分的。
聯繫就是大家都是一種穩定地把二進制數組變成可見字符的編碼方式。
base32中StdEncoding和HexEncoding所使用的字符不同。
base64中URLEncoding一般用於編碼URL。
「字符編碼」是指 ASCII, Unicode, UTF-8 等
