【问题标题】:Why is a SHA-1 Hash 40 characters long if it is only 160 bit?如果 SHA-1 哈希只有 160 位,为什么它长 40 个字符?
【发布时间】:2010-09-13 20:10:38
【问题描述】:

问题的标题说明了一切。我一直在研究 SHA-1,大多数地方我看到它有 40 个十六进制字符长,对我来说是 640 位。仅用 10 个十六进制字符 160 位 = 20 字节就不能很好地表示吗?一个十六进制字符可以代表2个字节对​​吗?为什么它需要两倍的时间?我的理解中缺少什么。

如果使用 Base32 或 Base36,SHA-1 不能只有 5 个或更少的字符吗?

【问题讨论】:

    标签: encoding hash sha1 hashcode base32


    【解决方案1】:

    一个十六进制字符只能表示 16 个不同的值,即 4 位。 (16 = 24)

    40 × 4 = 160。


    不,您需要 5 个以上的 base-36 字符。

    共有 2160 个不同的 SHA-1 哈希。

    2160 = 1640,所以这是我们需要 40 个十六进制数字的另一个原因。

    但是 2160 = 36160 log362 = 3630.9482...,所以你还是使用 base-36 需要 31 个字符。

    【讨论】:

    • 如果你使用base 4.3e9,你可以有5个字符
    • @NullUserException:不幸的是,在大约 2.09e6 之后,我的数字用完了。
    • 非常感谢您的解释,我知道我的数学一定是错误的。几年前我不得不做一些严肃的数学。
    • 如果您将字符集增加一倍以上(从 16 到 36),您会期望生成的字符串超过其原始大小的一半,这不是很有趣吗,但实际上确实如此不会发生(从 40 到 31)...
    【解决方案2】:

    我认为 OP 的困惑来自于代表 SHA1 哈希的 string 需要 40 个字节(至少如果您使用 ASCII),它等于 320 位(不是 640 位)。

    原因是哈希是二进制的,而十六进制字符串只是它的编码。因此,如果您要使用更有效的编码(或根本不使用编码),您可以只占用 160 位空间(20 字节),但问题是它不会是二进制安全的。

    您可以使用 base64,在这种情况下,您需要大约 27-28 个字节(或字符)而不是 40 个(请参阅this page)。

    【讨论】:

      【解决方案3】:

      每个 8 位字节有两个十六进制字符,而不是每个十六进制字符两个字节。

      如果您使用 8 位字节(如在 SHA-1 定义中),则十六进制字符会在一个字节内对单个高或低 4 位半字节进行编码。所以一个完整的字节需要两个这样的字符。

      【讨论】:

        【解决方案4】:

        2 个十六进制字符构成 0-255 的范围,即 0x00 == 0 和 0xFF == 255。所以 2 个十六进制字符是 8 位,这使得 SHA 摘要为 160 位。

        【讨论】:

          【解决方案5】:

          在我的理论中,关于 OP 混乱的确切起源,我的回答与之前的回答不同,并且在我提供阐明的婴儿步骤中。

          字符 占用不同的字节数,具体取决于所使用的编码 (see here)。现在有一些情况下我们每个字符使用 2 个字节,例如在 Java 中编程时 (here's why)。因此 40 个 Java 字符将等于 80 个字节 = 640 位(OP 的计算),而 10 个 Java 字符确实可以为 SHA-1 哈希封装适量的信息。

          与可能的数千个 Java 字符不同,只有 16 个不同的十六进制字符,即 0、1、2、3、4、5、6、7、8、9、A , B, C, D, E 和 F。但它们与 Java 字符不同,占用空间远小于 Java 字符 0 到 9 和 A 到 F 的编码。它们是表示所有可能值的符号仅用 4 位表示:

          0  0000    4  0100    8  1000    C  1100
          1  0001    5  0101    9  1001    D  1101
          2  0010    6  0110    A  1010    E  1110
          3  0011    7  0111    B  1011    F  1111
          

          因此每个十六进制字符只有半个字节,而 40 个十六进制字符给我们 20 个字节 = 160 位 - SHA-1 哈希的长度。

          【讨论】:

            【解决方案6】:

            SHA-1 是 160 位

            转换为 20 个字节 = 40 个十六进制字符(每个字节 2 个十六进制字符)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-10-27
              • 2013-12-03
              • 2021-09-25
              • 1970-01-01
              • 2015-10-10
              • 2014-12-14
              • 2015-12-13
              • 2013-12-11
              相关资源
              最近更新 更多