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

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

  • 1字节是8位
  • 如果1个字符是1个字节
  • 那么128位就是128/8 = 16字节,对吗?

编辑:

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

139224 次浏览

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

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

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

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

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

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

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

您可能想到的是 ASCII 文本字符,即8位。

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

首先,不要把 MD5散列想象成一个字符串,而是一个十六进制数。因此,每个数字是十六进制数字(0-15或0-F) ,表示4位,而不是8位。

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

MD5散列长度为128位,通常由32个十六进制数字表示。

SHA-1散列长度为160位,通常由40个十六进制数字表示。

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

同样,这篇文章只是基于以前的答案。

十六进制“字符”(nibble)与“字符”不同

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

  • 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],它表示一个字节的两半(我们称半字节为 一点点)。

当您查看 正则单字节字符,时(这里我们将完全跳过多字节和宽字符)

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

因此,它们显然是不同的,我希望这能够提供对差异的最佳分解。

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

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

MD5 = 32个十六进制数字

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

16字节 = 128位(16 * 8)

同样的情况也适用于 SHA-1,只不过它的长度是40个十六进制数字。

希望这个能帮上忙。

为了便于理解,请复制 二进制到六进制转换器中计算出的 MD5128位散列值,并查看十六进制值的长度。你会得到32个十六进制字符。