2010-11-25 177 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个字节。