42

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

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

4

6 に答える 6

93

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

40×4=160。


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

合計2160の異なるSHA-1ハッシュがあります

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

ただし、2 160 = 36 160 log 36 2 = 36 30.9482 ...であるため、base-36を使用すると31文字が必要になります。

于 2010-09-13T20:12:26.027 に答える
15

OPの混乱は、SHA1ハッシュを表す文字列が40バイト(少なくともASCIIを使用している場合)かかることに起因すると思います。これは、320ビット(640ビットではない)に相当します。

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

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

于 2010-09-13T20:30:54.150 に答える
9

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

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

于 2010-09-13T20:16:03.407 に答える
6

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

于 2010-09-13T20:12:41.170 に答える
6

私の答えは、OPの混乱の正確な起源に関する私の理論と、解明のために提供する赤ちゃんのステップにおいて、以前の答えとのみ異なります。

文字は、使用されるエンコーディングに応じて異なるバイト数を使用します(ここを参照)。最近、Javaでプログラミングする場合など、1文字あたり2バイトを使用する場合、いくつかのコンテキストがあります(理由は次のとおりです)。したがって、40個のJava文字はOPの計算である80バイト= 640ビットに等しく、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進文字はわずか0.5バイトであり、40の16進文字は20バイト=160ビット(SHA-1ハッシュの長さ)になります。

于 2017-07-18T22:20:13.023 に答える
4

SHA-1は160ビットです

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

于 2014-06-12T22:49:53.173 に答える