【问题标题】:MD5 is 128 bits but why is it 32 characters?MD5 是 128 位,但为什么是 32 个字符?
【发布时间】:2011-09-13 02:55:15
【问题描述】:

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

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

编辑:

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

【问题讨论】:

  • 您可以发布指向您引用的文档的链接吗?
  • @don:对不起,这是我的讲师笔记。但是 ba__friend 已经回答了我的问题,我在这里对其进行了测试:miraclesalad.com/webtools/md5.php,而且它只有十六进制字符,现在对我来说更有意义了。我会把他的答案选为最佳答案
  • 这不是一个愚蠢的问题。曾几何时,您也不知道一个字节有多少个 HEX 字符。
  • 一个快速的 python 单行来计算哈希的位长度是 ((1 << (n*4))-1).bit_length() 其中 n 是十六进制的哈希长度

标签: hash cryptography md5 cryptographic-hash-function


【解决方案1】:

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

【讨论】:

  • 1 字节由两位十六进制数表示,如 255 = ff。
  • 所以 1 字节是 2 个字符,这意味着 16 位是 2 个字符,然后 128/16 = 8。那么需要 2 个字符中的 8 个 = 16 个字符?为什么是 32?
  • 因为每个十六进制字符可以用 4 位表示。因此,如果它是 128 位,则它是 128/4 = 32 个十六进制字符。即使每个“char”将被编码为 utf8 或 ascii,这将使十六进制表示大小为 32*8= 256 位。
  • 这是一个非常糟糕的答案。我的回答对此进行了详细说明:stackoverflow.com/a/41618070/124486
  • @KorayTugay “所以 1 个字节是 2 个字符,这意味着 16 位是 2 个字符” - 1 个字节!= 16 位。
【解决方案2】:

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

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

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    • 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],它代表一个字节的两个半部分(我们称半字节为nibble)。

    当您查看常规单字节字符时,(我们将在这里完全跳过多字节和宽字符)

    • 它可以存储超过 16 种组合。
    • 字符的能力由编码决定。例如,ISO 8859-1 that stores an entire byte, stores all this stuff
    • 所有这些内容都占用了整个 2**8 范围。
    • 如果md5() 中的十六进制字符可以存储所有内容,您会看到所有小写字母、所有大写字母、所有标点符号和¡°ÀÐàð 之类的东西、空格之类的东西(换行符和制表符) , 和控制字符(您甚至看不到,而且其中很多都没有使用)。

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

    【讨论】:

    • 这个“在哪个顺序实际上取决于规范或平台”实际上是什么意思?希望看到更多解释。
    • @KumarM 我将删除它,因为我认为它实际上与对话无关,而且措辞不好。
    【解决方案4】:

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

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

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

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

    【讨论】:

    • 非常感谢..我现在脑子里的画面更清晰了!!
    • 注意:ascii-charset 包含不可打印的符号。
    • 我试图更明确地分解这一点stackoverflow.com/a/41618070/124486
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

      MD5 = 32 个十六进制数字

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

      16 字节 = 128 位 (16 * 8)

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

      我希望这会有所帮助。

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            为了清楚理解,把Binary to Hex convertor中的MD5计算出来的128位哈希值复制下来,看看Hex值的长度。您将获得 32 个字符的十六进制字符。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2014-06-27
              • 2011-12-04
              • 1970-01-01
              • 2012-09-30
              • 2016-07-19
              • 2013-07-24
              • 1970-01-01
              • 2013-07-02
              相关资源
              最近更新 更多