web-dev-qa-db-ja.com

MD5ハッシュおよびBase64エンコーディング

32文字の文字列(MD5ハッシュ)があり、Base64を使用してエンコードした場合、エンコードされた文字列の最大長はいくつですか?

18

MD5値は、Base64表記では常に22(有用な)文字長です。多くのBase64アルゴリズムでも、MD5ハッシュをエンコードするときに2文字のパディングが追加され、合計で24文字になります。パディングは有用な情報を追加しないため、破棄できます。重要なのは最初の22文字だけです。

理由は次のとおりです。

MD5ハッシュは128ビットの値です。 Base64文字列内のすべての文字には6ビットの情報が含まれています。これは、文字に64の可能な値があり、64に到達するには2の6乗が必要です。すべての文字に6ビットの情報がある場合、21文字には126ビットの情報があります。 22文字には132ビットの情報が含まれています。 128ビットは21文字以内に収まりませんが、22文字以内に収まるため(少し余裕があります)、128ビット値はBase64では常に22文字として表されます。

パディングに関する注意:

多くのBase64エンコードアルゴリズムでは、MD5値をエンコードするときに2、3文字のパディングが追加されることを前述しました。これは、Base64が3バイトの情報を4文字で表すためです。 MD5には16バイトの情報があるため、多くのBase64エンコードアルゴリズムは「==」を追加して、16バイトの入力が次の3の倍数、つまり18バイトであったことを2バイト短くしたことを示します。これらの2つの等号は、文字列に情報をまったく追加しないため、保存時に破棄できます。

43
Thomas Albright

http://en.wikipedia.org/wiki/Base64 のとおり

「nバイトの入力が与えられた場合、出力は(n + 2-((n + 2)%3))/ 3 * 4バイト長であり、n * 4/3または1.33333nに収束します」

したがって、((32 + 2-(32 + 2)%3))/ 3 * 4 = 34-(34%3)/ 3 * 4 =(34-1)/ 3 * 4 = 33/3 * 4 = 44文字。

常に生のバイナリ形式(128ビット)で抽出し、直接base 64にエンコードできます。つまり、32ではなく16バイトに変換します。つまり、base 64でエンコードすると24バイトになります。

10
Arantor