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

问题的标题说明了一切。我一直在研究SHA-1和大多数地方,我看到它是40个十六进制字符长,对我来说是640bit。它只能用10个十六进制字符160bit = 20byte来表示。一个十六进制字符可以表示2个字节对​​吗?为什么它需要的时间是它的两倍?我的理解中缺少什么。 如果使用Base32或Base36,SHA-1甚至不能只有5个或更少的字符?     
已邀请:
一个十六进制字符只能表示16个不同的值,即4位。 (16 = 24) 40次&次; 4 = 160。 不,你需要在base-36中超过5个字符。 共有2160种不同的SHA-1哈希值。 2160 = 1640,所以这是我们需要40个十六进制数字的另一个原因。 但是2160 = 36160 log362 = 3630.9482 ...,所以你仍然需要使用base-36的31个字符。     
我认为OP的混淆来自表示SHA1哈希值的字符串需要40个字节(至少如果你使用的是ASCII),它等于320位(不是640位)。 原因是哈希是二进制的,十六进制字符串只是一个编码。因此,如果您使用更高效的编码(或根本不使用编码),您只需要160位空间(20个字节),但问题是它不是二进制安全的。 你可以使用base64,在这种情况下你需要大约27-28字节(或字符)而不是40(参见本页)。     
每个8位字节有两个十六进制字符,而不是每个十六进制字符两个字节。 如果使用8位字节(如在SHA-1定义中),则十六进制字符在一个字节内编码单个高或低4位半字节。因此,完整字节需要两个这样的字符。     
2个十六进制字符的范围为0-255,即0x00 == 0和0xFF == 255.因此,2个十六进制字符为8位,这使得SHA摘要为160位。     
SHA-1是160位 这意味着20个字节= 40个十六进制字符(每个字节2个十六进制字符)     
我的答案与我之前的理论有所不同,关于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
因此,每个十六进制字符只有半个字节,40个十六进制字符给出20个字节= 160位 - SHA-1哈希的长度。     

要回复问题请先登录注册