これは、ハッシュ関数について私が理解したことがないものです。 whirlpoolやblowfishなどのアルゴリズムは両方とも、このパターンに従わない出力を生成することを知っていますが、なぜほとんどがそうするのですか?ハードウェア/ソフトウェアのようなものですか?彼らがa-f0-9ではなくa-z0-9になった出力を生成した場合、それによって複雑さが増すのではないでしょうか。
16進数でエンコードされています。 16バイトのmd5ハッシュには印刷不可能な文字を含めることができるため、32文字の16進数文字列にエンコードされます。
他の人が応答したように、ハッシュ関数(MD5、SHA-256、Whirlpoolおよびその他の数十の関数を含むすべて)はビットを出力します。 MD5の出力は128ビットです。しかし、人間はビットを読むのが苦手です。人間は文字を読むのが得意です。したがって、ハッシュ関数の出力が人間が使用することを意図している場合、それは何らかのエンコーディングを使用して文字に変換されます。
16進数 は、ビットから文字への最も単純なエンコードの1つです。 4ビットのチャンクを数字または「a」から「f」の範囲の文字に変換します。他のエンコーディングが存在します。 Base64 、これはより大きなアルファベット(16ではなく64記号)を使用し、よりコンパクトです(MD5の128ビット出力は、Base64では24文字、16進数では32文字としてエンコードされます)。実装が少し複雑です。
16進数の多くの可能なバリアントがあります。例えば(読みやすいように)数文字ごとにスペースを追加したり、コロン記号( ':')などの他の句読点を追加したりできます。大文字または小文字を使用できます。 ハッシュ関数出力の伝統は、スペースや句読点のない小文字を使用することです。この伝統は、MD5の初期の段階ですでに実施されていました。MD5は1991年に設計され、1992年4月に RFC 1321 として公開されました。そのドキュメント(最後の方、セクションA.5の近く)でわかるように、ハッシュ出力は既に小文字の16進数を使用しています。
Thomas Porninの答えは素晴らしいですが、さらにポイントがあります。ハッシュのoutputの伝統と可読性だけでなく、に適用される場所がありますinput。ダイジェストアクセス認証の RFC2069 では、より多くのデータと連結されると、ハッシュ出力が再ハッシュされます。しかし、(私にとって)直観的には、再ハッシュするときに使用されるハッシュの表現は、ビットストリームとしてのハッシュ出力だけではなく、人間が読み取れる小文字の16進文字バージョンです。つまり、入力は必要な長さの2倍です。セクション3.1.3のRFCは、「このドキュメントの目的のために」この表現を指定します。これは、「このアルゴリズムの目的のために」ほど明確ではありませんが、私のテストでは、Firefoxの実装に当てはまることが示されていますMD5とすべての実装が明らかに一致している必要があります。逆に、ビットコインのダブルSHA-256ハッシュはバイナリ表現を使用します ダブルSHA-256エンコーディングをどのように実行しますか?