web-dev-qa-db-ja.com

MD5は128ビットですが、なぜ32文字ですか?

私はmd5に関するいくつかのドキュメントを読んで、128ビットと言っていましたが、なぜ32文字ですか?文字を計算できません。

  • 1バイトは8ビットです
  • 1文字が1バイトの場合
  • 128ビットは128/8 = 16バイトです?

編集:

SHA-1は160ビットを生成するので、文字数はいくつですか?

75
hash_jr90

16進表現として32文字、つまり1バイトあたり2文字。

93
ba__friend

回答の一部を1つの投稿にまとめたいと思いました。

まず、MD5ハッシュを文字列としてではなく、16進数として考えないでください。したがって、各桁は16進数(0〜15または0〜F)であり、8ビットではなく4ビットを表します。

さらに、1バイトまたは8ビットは2桁の16進数で表されます。 b '1111 1111 '= 0xFF = 255

MD5ハッシュの長さは128ビットで、一般に32桁の16進数で表されます。

SHA-1ハッシュは長さが160ビットで、一般に40桁の16進数で表されます。

SHA-2ファミリの場合、ハッシュの長さは事前に設定されたセットの1つになると思います。したがって、SHA-512は128桁の16進数で表すことができます。

繰り返しますが、この投稿は以前の回答に基づいています。

27
RepentantFan

16進数の「キャラクター」(ニブル)は「キャラクター」とは異なります

ビット対バイト、対文字を明確にするため。

  • 1バイトは8ビットです(目的のため)
  • 8ビットは_2**8_可能な組み合わせを提供します:256の組み合わせ

16進文字を見ると、

  • _[0-9] + [a-f]_の16の組み合わせ:_0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f_の全範囲
  • 16は256より小さいので、1つの16進文字は1バイトを(not格納します。
  • 16は_2**4_です。これは、1つの16進文字が1バイト(4バイト)に4ビットを格納できることを意味します。
  • したがって、2つの16進文字は、8ビットの_2**8_の組み合わせを格納できます。
  • 16進文字として表されるバイトは_[0-9a-f][0-9a-f]_であり、バイトの半分を表します(ハーフバイトを nibble と呼びます)。

通常のシングルバイト文字を見ると、(ここではマルチバイト文字とワイド文字を完全にスキップします)

  • 16を超える組み合わせを保存できます。
  • 文字の機能は、エンコーディングによって決まります。たとえば、 ISO 8859-1はバイト全体、このすべてを格納します
  • すべてのものは_2**8_の範囲全体を取ります。
  • md5()の16進文字がすべてを格納できる場合、すべての小文字、すべての大文字、すべての句読点、および_¡°ÀÐàð_のようなもの、空白のような(改行、およびタブ)、および制御文字(表示することさえできず、その多くは使用されていません)。

したがって、それらは明らかに異なっており、それが違いの最良の内訳を提供することを願っています。

23
Evan Carroll

MD5は16進数(0〜15/0〜F)を生成するため、それぞれ4ビットです。 128/4 = 32文字。

SHA-1は16進数字(0-15/0-F)も生成するため、160/4 = 40文字です。

(それらは数学演算であるため、ほとんどのハッシュ関数の出力は通常16進数で表されます。)

おそらくASCII 8ビットのテキスト文字を考えていたでしょう。

19
Wiseguy

これは32桁の16進文字です-1つの16進文字は4ビットです。

8
Brett Thomas

これらは文字ではなく16進数です。 1桁= 4ビット。

2
eaolson

実際には文字ではなく、16進数です。

2
Jack Edmonds