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


95

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

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

编辑:

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


您可以发布指向您引用的文档的链接吗?
唐·罗比

@don:对不起,我的讲师指出。但是ba__friend已经回答了我的问题,我在这里进行了测试:miraclesalad.com/webtools/md5.php,并且它仅是真正的十六进制字符,现在对我来说意义更大。我会将他的答案投票为最佳答案
hash_jr90

我认为我的答案比其他任何答案都更详细。如果您是计算机编程的新手,并提出了一个完整的答案
Evan Carroll

9
这不是一个愚蠢的问题。曾几何时,您也不知道一个字节代表多少个十六进制字符。
David Klempfner

一种快速的python((1 << (n*4))-1).bit_length()
底线

Answers:


107

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


1
1个字节由两位十六进制数表示,例如255 = ff。
ba__friend 2011年

1
所以1个字节是2个字符,这意味着16个位是2个字符,那么128/16 =8。那么需要8个2个字符= 16个字符吗?为什么是32?
Koray Tugay 2014年

15
因为每个十六进制字符都可以用4位表示。因此,如果是128位,则为128/4 = 32个十六进制字符。即使每个“字符”将被编码为utf8或ascii,这将使十六进制表示尺寸为32 * 8 = 256位。
加斯顿·桑切斯2014年

2
这是一个很差的答案。我的答案对此进行了详细介绍:stackoverflow.com/a/41618070/124486
Evan Carroll

@KorayTugay“所以1个字节是2个字符,这意味着16位是2个字符”-1个字节!= 16位。
David Klempfner '18

36

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

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

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

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

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

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

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


26

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

要明确位与字节,字符。

  • 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()可以存储所有内容,那么您会看到所有小写字母,所有大写字母,所有标点符号以及诸如¡°ÀÐàð,空格(如换行符和制表符)之类的内容以及控制字符(可以甚至看不到,其中许多都没有使用)。

因此它们显然是不同的,我希望能最好地打破这些差异。


1
“按规范或平台的实际顺序排列”实际上是什么意思?希望看到更多的解释。
KumarM

@KumarM我将删除该内容,因为我认为这实际上与对话无关,而且用词不当。
埃文·卡罗尔

22

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

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

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

您可能会想到8位的ASCII文本字符。


非常感谢你..我的脑海里有了更清晰的画面!!
hash_jr90 2011年

注意:ascii-charset包含不可打印的符号。
罗伊·李

我试图更明确地分解这一点stackoverflow.com/a/41618070/124486
Evan Carroll


2

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



2

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

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

MD5 = 32位十六进制数字

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

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

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

我希望这有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.