2010-11-25 325 views
11

如果我有一個32字符的字符串(MD5哈希),我使用Base64進行編碼,那麼編碼字符串的最大長度是多少?MD5哈希和Base64編碼

+5

如果你有一個32字符的字符串是一個MD5散列,那麼它已經是十六進制編碼,並且不需要base64對它進行編碼。 – 2010-11-25 14:42:45

+1

MD5哈希不是十六進制!它是16個字節 - 十六進制只是一個傳統的表示。 – 2010-11-25 23:35:20

回答

31

MD5的值是總是22(有用)字符長以Base64表示法。在編碼MD5散列時,許多Base64算法還會附加2個填充字符,從而使總數達到24個字符。填充沒有添加有用的信息,可以丟棄。只有前22個字符很重要。

原因如下:

MD5哈希是一個128位的值。 Base64字符串中的每個字符都包含6位信息,因爲該字符有64個可能的值,並且需要6個冪的2才能達到64.每個字符中有6位信息,21個字符有126位信息, 22個字符包含132位信息。由於128位不能在21個字符之內,但在22個字符之內(有一點空間可用),在Base64中128位值總是以22個字符表示。

在填充的說明:

我上述許多Base64編碼算法提到編碼MD5值時添加幾個填充的字符。這是因爲Base64將3個字節的信息表示爲4個字符。由於MD5有16個字節的信息,因此許多Base64編碼算法會附加「==」來指定16個字節的輸入比3的下一個倍數短2個字節,這將是18個字節。這兩個相同的符號不會給字符串添加任何信息,並且可以在存儲時丟棄。

7

作爲每http://en.wikipedia.org/wiki/Base64

「。注意,給定的n個字節的輸入,輸出將是第(n + 2 - ((N + 2)%3))/ 3 * 4個字節長,這收斂到對於大n,n * 4/3或1.33333n。「 ((32 + 2 - (32 + 2)%3))/ 3 * 4 = 34 - (34%3)/ 3 * 4 =(34-1)/ 3 * 4(012)。 = 33/3 * 4 = 44個字符。

您可以始終以原始二進制形式(128位)提取它,並將其直接編碼到基本64位,這意味着轉換16個字節而不是32位,這會在base 64編碼時變爲24個字節。