Commons Codec の md5

単に文字列のMD5値を取りたいだけなのですが、どうも他の言語(PerlRubyPHPなど)で作成したHASH値と異なるので不思議に思っていたら、Commons Codec の org.apache.commons.codec.digest.DigestUtils#md5(String) は文字列を UTF-8 としてバイト配列を作成して処理しているからずれてた。

UTF-8 以外の文字列のHASH値を取りたい場合は自分でバイト配列を取得してから、org.apache.commons.codec.digest.DigestUtils#md5(byte) で取得するのが正しそう。

例えば、文字列のエンコードが Windows-31J の場合は以下のような感じで。

String s = "ダイジェスト";
String hash = DigestUtils.md5Hex(s.getBytes("Windows-31J"));