我读了一些关于md5的文档,它说它是128位,但为什么只有32个字符?我无法计算这些字符。
- 1字节等于8位
- 如果1个字符等于1个字节
- 那么128位就是128/8 = 16个字节,对吧?
编辑:
SHA-1产生160位,那么有多少个字符呢?
我读了一些关于md5的文档,它说它是128位,但为什么只有32个字符?我无法计算这些字符。
编辑:
SHA-1产生160位,那么有多少个字符呢?
32个字符的十六进制表示,每个字节2个字符。
我想把一些答案总结在一个帖子里。
首先,不要把MD5哈希看作字符字符串,而是看作十六进制数字。因此,每个数字都是一个十六进制数字(0-15或0-F),代表4位,而不是8位。
更进一步,一个字节或8位由两个十六进制数字表示,例如 b'1111 1111
' = 0xFF
= 255
。
MD5哈希有128位长度,通常由32个十六进制数字表示。
SHA-1哈希有160位长度,通常由40个十六进制数字表示。
对于SHA-2系列,我认为哈希长度可以是预定集的其中一个。因此,SHA-512可以由128个十六进制数字表示。
再次说明,本帖仅基于以前的答案。
为了澄清位,字节和字符的区别。
2 ** 8
种可能的组合:256种组合当您查看一个十六进制字符时,
[0-9]+[a-f]
的16种组合:完整范围的0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f
2 ** 4
:这意味着一个十六进制字符可以在一个字节中存储4个位(半个字节)。2 ** 8
种组合。[0-9a-f] [0-9a-f]
,它表示字节的两半(我们称一个半字节为nibble)。当您查看一个普通的单字节字符时(我们完全会跳过多字节和宽字符),
2 ** 8
范围。md5()
里都可以存储的话,你会看到所有小写字母、大写字母、标点符号和像 ¡°ÀÐàð
这样的字符,还有空格(例如换行和制表符)以及控制字符(你甚至看不到其中的许多控制字符,因为它们没有被使用)。所以它们明显是不同的,我希望这提供了最好的区别分析。
MD5计算出十六进制数字(0-15 / 0-F),因此每个数字占用四位。128 / 4 = 32个字符。
SHA-1也会计算出十六进制数字(0-15 / 0-F),因此160 / 4 = 40个字符。
(由于它们是数学运算,所以大多数哈希函数的输出通常表示为十六进制数。)
你可能在想ASCII文本字符,它们是8位。
一个十六进制数字 = 1 四位二进制数(四位二进制数)
两个十六进制数字 = 1 字节(八位二进制数)
MD5 = 32 个十六进制数字
32 个十六进制数字 = 16 字节(32/2)
16 字节 = 128 位(16 * 8)
对于SHA-1也是同样的规则,只不过它有40个十六进制数字。
希望这可以帮到您。
实际上它们不是字符,而是十六进制数字。
((1 << (n*4))-1).bit_length()
,其中n是十六进制哈希的长度。 - Wouterr