web-dev-qa-db-ja.com

SHA-1ハッシュが160ビットしかないのに40文字の長さがあるのはなぜですか?

質問のタイトルはそれをすべて言っています。私はSHA-1を研究してきましたが、ほとんどの場所では40ビットの16進数文字であることがわかりましたが、これは640ビットです。わずか10桁の16進文字160bit = 20byteだけではうまく表現できないでしょうか。そして、1つの16進文字は2バイトを表すことができますか?必要な長さの2倍なのはなぜですか?私の理解には何が欠けていますか。

Base32またはBase36を使用している場合、SHA-1を5文字以下にすることはできませんか?

37
AGrunewald

1つの16進文字は、16の異なる値、つまり4ビットのみを表すことができます。 (16 = 24

40×4 = 160。


いいえ、base-36には5文字以上必要です。

全部で2つあります160 異なるSHA-1ハッシュ。

2160 = 1640、これが40桁の16進数が必要なもう1つの理由です。

しかし、2160 = 36160ログ362 = 3630.9482 ...、したがって、base-36を使用して31文字が必要です。

83
kennytm

OPの混乱は、stringが原因で、SHA1ハッシュが40バイト(少なくともASCIIを使用している場合)を表し、320ビット(ない640ビット)。

その理由は、ハッシュがバイナリであり、16進文字列がそのエンコードにすぎないためです。したがって、より効率的なエンコードを使用する場合(またはまったくエンコードしない場合)、160ビット(20バイト)のスペースしか使用できませんが、問題はバイナリセーフではないことです。

ただし、base64を使用できます。この場合、40ではなく約27〜28バイト(または文字)が必要になります( このページ を参照)。

12

16進文字ごとに2バイトではなく、8ビットバイトごとに2つの16進文字があります。

(SHA-1定義のように)8ビットバイトを使用している場合、16進文字は、バイト内の単一の高または低4ビットニブルをエンコードします。したがって、完全なバイトにこのような文字が2つ必要です。

9

2つの16進文字は0-255の範囲になります。つまり、0x00 == 0および0xFF == 255です。したがって、2つの16進文字は8ビットであるため、SHAダイジェストに対して160ビットになります。

5
Jim Brissom

SHA-1は160ビットです

これは、20バイト= 40の16進文字(バイトごとに2つの16進文字)に変換されます

4
dipendu

私の答えは、OPの混乱の正確な起源に関する私の理論と、私が解明のために提供する赤ん坊の段階で、以前の答えとは異なります。

characterは、使用されるエンコーディングに応じて異なるバイト数を使用します( こちらを参照 )。 Java( here's why ))でプログラミングする場合など、文字ごとに2バイトを使用する最近のコンテキストがいくつかあります。したがって、40 Java文字は80バイト= 640ビット、OPの計算に等しく、10 Java文字は実際にSHA-1ハッシュに適切な量の情報をカプセル化します。

数千の可能なJava文字とは異なり、16種類の異なる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

したがって、各16進文字は半分のバイトのみで、40の16進文字は20バイト= 160ビット(SHA-1ハッシュの長さ)を提供します。

4
Reg