質問のタイトルはそれをすべて言っています。私はSHA-1を研究してきましたが、ほとんどの場所では40ビットの16進数文字であることがわかりましたが、これは640ビットです。わずか10桁の16進文字160bit = 20byteだけではうまく表現できないでしょうか。そして、1つの16進文字は2バイトを表すことができますか?必要な長さの2倍なのはなぜですか?私の理解には何が欠けていますか。
Base32またはBase36を使用している場合、SHA-1を5文字以下にすることはできませんか?
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文字が必要です。
OPの混乱は、stringが原因で、SHA1ハッシュが40バイト(少なくともASCIIを使用している場合)を表し、320ビット(ない640ビット)。
その理由は、ハッシュがバイナリであり、16進文字列がそのエンコードにすぎないためです。したがって、より効率的なエンコードを使用する場合(またはまったくエンコードしない場合)、160ビット(20バイト)のスペースしか使用できませんが、問題はバイナリセーフではないことです。
ただし、base64を使用できます。この場合、40ではなく約27〜28バイト(または文字)が必要になります( このページ を参照)。
16進文字ごとに2バイトではなく、8ビットバイトごとに2つの16進文字があります。
(SHA-1定義のように)8ビットバイトを使用している場合、16進文字は、バイト内の単一の高または低4ビットニブルをエンコードします。したがって、完全なバイトにこのような文字が2つ必要です。
2つの16進文字は0-255の範囲になります。つまり、0x00 == 0および0xFF == 255です。したがって、2つの16進文字は8ビットであるため、SHAダイジェストに対して160ビットになります。
SHA-1は160ビットです
これは、20バイト= 40の16進文字(バイトごとに2つの16進文字)に変換されます
私の答えは、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ハッシュの長さ)を提供します。