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

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

  • 1个字节是8位
  • 如果1个字符是1个字节
  • 那么128位是128/8 = 16字节吧?

编辑:

SHA-1产生160位,所以有多less个字符?

32个字符作为hex表示,即每个字节2个字符。

我想在一篇文章中总结一些答案。

首先,不要将MD5散列视为string,而应视为hex数字。 因此,每个数字是一个hex数字(0-15或0-F),代表四个位,而不是八个。

进一步来说,一个字节或八位由两个hex数字表示,例如1111 1111 '= 0xFF = 255

MD5散列长度为128位,通常由32个hex数字表示。

SHA-1散列长度为160位,一般用40个hex数字表示。

对于SHA-2系列,我认为散列长度可以是预先确定的集合之一。 所以SHA-512可以用128个hex数字表示。

再一次,这篇文章只是基于以前的答案。

MD5产生hex数字(0-15 / 0-F),所以它们是四位。 128/4 = 32个字符。

SHA-1也产生hex数字(0-15 / 0-F),所以160/4 = 40个字符。

(由于它们是math运算,所以大部分散列函数的输出通常用hex数字表示)。

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

hex“字符”(半字节)不同于“字符”

要清楚的位vs字节,vs字符。

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

当你看一个hex字符时,

  • [0-9] + [af] 16个组合: 0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f的全部范围0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
  • 16小于256,所以一个hex字符不存储一个字节。
  • 16是2**4 :这意味着一个hex字符可以在一个字节中存储4位。
  • 因此,两个hex字符,可以存储8位, 2**8组合。
  • 表示为hex字符的字节是[0-9a-f][0-9a-f] ,表示一个字节的二分之二(我们称半字节为半字节 )。 实际上依赖于规格或平台的顺序: 0F可以表示0000111111110000

当你看一个正规的人物,

  • 它可以存储远远超过16个组合。
  • 字符的能力由编码决定 例如, ISO 8859-1存储所有这些东西
  • 所有的东西都需要整个2**8范围。
  • 如果一个md5()中的hex字符可以存储所有的内容,你可以看到所有的小写字母,所有的大写字母,所有的标点符号,像¡°ÀÐàð换行符”和“制表符”这样的空格,字符(你甚至不能看到,其中许多字符都没有使用)。

所以他们明显不同,我希望能提供最好的分歧。

这是32个hex字符 – 1个hex字符是4位。

那些是hex数字,而不是字符。 一位数= 4位。

他们实际上不是字符,而是hex数字。