如果只有160位,为什么SHA-1哈希长40个字符?

AGr*_*ald 39 hash encoding sha1 hashcode base32

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

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

ken*_*ytm 86

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

40×4 = 160.


不,你需要在base-36中超过5个字符.

共有2 160个不同的SHA-1哈希值.

2 160 = 16 40,所以这是我们需要40个十六进制数字的另一个原因.

但是2 160 = 36 160 log 36 2 = 36 30.9482 ...,所以你仍然需要使用base-36的31个字符.

  • 如果使用base 4.3e9`,则可以有5个字符 (18认同)

Nul*_*ion 12

我认为OP的混淆来自表示SHA1哈希的字符串需要40个字节(至少如果你使用的是ASCII),它等于320位(不是640位).

原因是哈希是二进制的,十六进制字符串只是一个编码.因此,如果您使用更高效的编码(或根本不使用编码),您只需要160位空间(20个字节),但问题是它不是二进制安全的.

你可以使用base64,在这种情况下你需要大约27-28字节(或字符)而不是40(参见本页).


Jef*_*dge 9

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

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


Jim*_*som 6

2个十六进制字符的范围为0-255,即0x00 == 0和0xFF == 255.因此,2个十六进制字符为8位,这使得SHA摘要为160位.


Reg*_*Reg 6

我的答案仅与我的理论中关于 OP 混淆的确切起源的先前答案不同,并且在我提供的初步步骤中进行了说明。

根据所使用的编码,一个字符占用不同数量的字节(请参阅此处)。如今,当我们使用每个字符 2 个字节时,有一些上下文,例如在用 Java 编程时(这就是原因)。因此,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
Run Code Online (Sandbox Code Playgroud)

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