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

has*_*r90 77 hash md5 cryptography cryptographic-hash-function

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

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

编辑:

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

ba_*_*end 96

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

  • 因为每个十六进制字符可以用4位表示.因此,如果它是128位,则它是128/4 = 32个十六进制字符.即使每个"char"将被编码为utf8或ascii,这将使十六进制表示大小为32*8 = 256位. (13认同)
  • 这是一个非常糟糕的答案.我的答案详细说明:http://stackoverflow.com/a/41618070/124486 (2认同)

小智 27

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

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

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

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

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

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

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


Eva*_*oll 23

十六进制"字符"(半字节)不同于"字符"

要明确比特与字节,vs字符.

  • 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范围.
  • 如果一个十六进制字符md5()可以存储所有这些,你会看到所有小写字母,所有大写字母,所有标点符号和类似的东西¡°ÀÐàð,如(换行符和制表符)和控制字符(你可以'甚至看到,其中很多都没有使用).

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


Wis*_*guy 19

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

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

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

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


Bre*_*mas 8

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


Fat*_*ror 7

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

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

MD5 = 32 个十六进制数字

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

16 字节= 128 位 (16 * 8)

这同样适用于 SHA-1,只是它的长度为 40 个十六进制数字。

我希望这有帮助。