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


95

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

  • 1バイトは8ビットです
  • 1文字が1バイトの場合
  • それなら128ビットは128/8 = 16バイトですよね?

編集:

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


参照しているドキュメントへのリンクを投稿できますか?
ドン・ロビー

@don:申し訳ありませんが、私の講師のメモです。しかし、ba__friendが私の質問に答えてくれたので、ここでテストします:miraclesalad.com/webtools/md5.phpと、実際には16進文字のみであるため、今でははるかに理にかなっています。私は彼の答えをベストアンサーとして投票します
hash_jr90 2011年

私の答えは、これについて他のどの回答よりも詳細に説明されていると思います。あなたがコンピュータプログラミングに不慣れで、この質問をしていて
Evan Carroll

9
それはばかげた質問ではありません。昔々、1バイトを表すHEX文字の数もわかりませんでした。
David Klempfner 2018

ハッシュのビット長を計算するための簡単なPythonワンライナー((1 << (n*4))-1).bit_length()は次の
とおり

回答:


107

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


1
1バイトは、255 = ffのように2桁の16進数で表されます。
ba__friend 2011年

1
したがって、1バイトは2文字です。つまり、16ビットは2文字であり、128/16 = 8です。したがって、2文字のうち8文字= 16文字が必要ですか?なぜ32?
Koray Tugay 2014

15
各16進文字は4ビットで表すことができるためです。したがって、128ビットの場合は128/4 = 32の16進文字になります。各「char」はutf8またはasciiとしてエンコードされますが、これにより16進表現のサイズは32 * 8 = 256ビットになります。
ガストンサンチェス

2
これは本当に悪い答えです。私の答えはこれについて詳しく説明します:stackoverflow.com/a/41618070/124486
Evan Carroll

@KorayTugay "つまり、1バイトは2文字、つまり16ビットは2文字です" -1バイト!= 16ビット。
David Klempfner 2018

36

いくつかの回答を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進数で表すことができます。

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


26

16進数の「文字」(ニブル)は「文字」とは異なります

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

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

16進文字を見ると

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

あなたが見てみると、通常のシングルバイト文字、(我々は完全にここでは、マルチバイトおよびワイド文字をスキップするつもりです)

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

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


1
この「実際に仕様またはプラットフォームに依存する順序」とは、実際にはどういう意味ですか?これがもう少し説明されるのを見たいです。
KumarM

@KumarM会話とはまったく関係がないと思うので、削除します。言い回しが悪いです。
エヴァンキャロル

22

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

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

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

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


どうもありがとうございました..私は今私の頭の中ではるかに明確な絵を持っています!
hash_jr90 2011年

注:ascii-charsetには、印刷できない記号が含まれています。
ロイ・リー

私はこれをもう少し明確に分解しようとしましたstackoverflow.com/a/41618070/124486–
Evan Carroll




2

1桁の16進数= 1ニブル(4ビット)

2桁の16進数= 1バイト(8ビット)

MD5 = 32桁の16進数

32桁の16進数= 16バイト(32/2)

16バイト= 128ビット(16 * 8)

同じことがSHA-1にも当てはまりますが、長さが40桁の16進数です。

これがお役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.