首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MD5是128位,但为什么是32个字符?

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

Stack Overflow用户
提问于 2011-06-11 17:00:32
回答 9查看 139.1K关注 0票数 129

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

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

编辑:

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

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-06-11 17:03:23

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

票数 128
EN

Stack Overflow用户

发布于 2013-04-16 16:19:23

我想把一些答案总结成一个帖子。

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

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

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

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

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

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

票数 45
EN

Stack Overflow用户

发布于 2017-01-12 16:17:38

十六进制“字符”(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()中的十六进制字符可以存储所有这些,那么您将看到所有小写字母、所有大写字母、所有标点符号和诸如¡°ÀÐàð之类的东西、空格(换行符和制表符)和控制字符(您甚至看不到这些字符,其中许多字符没有使用)。

因此,它们显然是不同的,我希望这能提供最好的解决方案。

票数 36
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6317276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档