119

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

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

编辑:

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

4

9 回答 9

122

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

于 2011-06-11T17:03:23.890 回答
41

我想将一些答案汇总到一篇文章中。

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

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

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

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

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

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

于 2013-04-16T16:19:23.480 回答
32

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

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

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

当你看一个十六进制字符时,

  • 16种组合[0-9] + [a-f]:全系列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范围。
  • 如果 an 中的十六进制字符md5()可以存储所有这些,您会看到所有小写字母、所有大写字母、所有标点符号和诸如¡°ÀÐàð、 空格之类的东西(换行符和制表符)和控制字符(你可以'甚至看不到,其中许多都没有使用)。

所以它们显然是不同的,我希望这能提供最好的差异分解。

于 2017-01-12T16:17:38.153 回答
29

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

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

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

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

于 2011-06-11T17:04:35.690 回答
9

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

于 2011-06-11T17:03:36.893 回答
9

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

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

MD5 = 32 个十六进制数字

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

16 字节= 128 位 (16 * 8)

这同样适用于 SHA-1,除了它有 40 个十六进制数字长。

我希望这有帮助。

于 2019-09-11T03:10:19.460 回答
3

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

于 2011-06-11T17:03:40.240 回答
2

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

于 2011-06-11T17:04:02.737 回答
0

为了清楚理解,将二进制到十六进制转换器中的 MD5 计算的 128 位哈希值复制并查看十六进制值的长度。您将获得 32 个字符的十六进制字符。

于 2021-07-14T04:40:09.837 回答