MD5是128位,但为什么是32个字符?

时间:2011-06-11 17:00:32

标签: hash cryptography md5 cryptographic-hash-function

我读了一些关于md5的文档,它说它的128位,但为什么它是32个字符?我无法计算角色。

  • 1个字节是8位
  • 如果1个字符是1个字节
  • 然后128位是128/8 = 16字节对吗?

编辑:

SHA-1产生160位,那么有多少个字符?

9 个答案:

答案 0 :(得分:89)

以十六进制表示的32个字符,即每字节2个字符。

答案 1 :(得分:28)

我想将一些答案总结成一篇文章。

首先,不要将MD5哈希视为字符串,而是将其视为十六进制数。因此,每个数字都是十六进制数字(0-15或0-F),代表四位,而不是八位。

进一步说,一个字节或八个比特由两个十六进制数字表示,例如, b'1111 1111'= 0xFF = 255

MD5哈希长度为1​​28位,通常用32位十六进制数字表示。

SHA-1哈希长度为1​​60位,通常用40个十六进制数字表示。

对于SHA-2系列,我认为哈希长度可以是预先确定的一组。因此SHA-512可以用128个十六进制数字表示。

同样,这篇文章仅基于之前的答案。

答案 2 :(得分:21)

一个十六进制"字符" (半字节)与"字符"

不同

要清楚比特与字节,对比字符。

  • 1个字节是8位(用于我们的目的)
  • 8位提供2**8种可能的组合:256种组合

当您查看十六进制字符时,

  • [0-9] + [a-f]的16种组合:0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • 的全部范围
  • 16小于256,因此一个十六进制字符存储一个字节。
  • 16是2**4:这意味着一个十六进制字符可以在一个字节(半个字节)中存储4位。
  • 因此,两个十六进制字符可以存储8位2**8组合。
  • 以十六进制字符表示的字节为[0-9a-f][0-9a-f],表示一个字节的两半(我们将半字节称为nibble)。

当您查看常规单字节字符时(我们完全会在此处跳过多字节和宽字符)

  • 它可以存储超过16种组合。
  • 字符的功能由编码确定。例如,ISO 8859-1 that stores an entire byte, stores all this stuff
  • 所有这些内容都需要整个2**8范围。
  • 如果md5()中的十六进制字符可以存储所有内容,您可以看到所有小写字母,所有大写字母,所有标点符号和¡°ÀÐàð之类的内容,像空格一样(换行符和制表符)和控制字符(您甚至无法看到这些字符,其中许多字符未被使用)。

所以他们明显不同,我希望能够最好地区分差异。

答案 3 :(得分:18)

MD5产生十六进制数字(0-15 / 0-F),因此它们各为4位。 128/4 = 32个字符。

SHA-1也产生十六进制数字(0-15 / 0-F),因此160/4 = 40个字符。

(由于它们是数学运算,因此大多数散列函数的输出通常表示为十六进制数字。)

您可能正在考虑ASCII文本字符,即8位。

答案 4 :(得分:8)

这是32个十六进制字符 - 1个十六进制字符是4位。

答案 5 :(得分:2)

这些是十六进制数字,而不是字符。一位= 4位。

答案 6 :(得分:2)

它们实际上不是字符,它们是十六进制数字。

答案 7 :(得分:0)

一个十六进制数字 = 1 nibble(四位)

两个十六进制数字 = 1个字节(八位)

MD5 = 32个十六进制数字

32个十六进制数字 = 16个字节(32/2)

16个字节 = 128位(16 * 8)

SHA-1相同,但长度为40个十六进制数字。

我希望这会有所帮助。

答案 8 :(得分:0)

为了清楚理解,将MD5计算出的128位hash值复制到Binary to Hex convertor中,查看Hex值的长度。您将获得 32 个字符的十六进制字符。