harukazepc’s blog

インターネッツとAndroidなどが大好きです。あとは日々のことなど。

javaでmd5の実装(日本語注意?)

javamd5を実装していたのだけど、他の言語で出来たmd5値と違うことがあり。
日本語入ると違う値になる状況。

@IT:Java TIPS -- Javaでダイジェストを生成するをそのまま利用させてもらっていた。が、うまくいかずなんでだろうと。。。

原因は、String.getBytes()でした。
Stringのjavadocによると、引数を与えないと「プラットフォームのデフォルト文字セットを使用」するとのこと・・・

変換対象はwindows-31jな文字列なんだけど、別の文字セットでやろうとしてしまったらしい。

md.digest(str.getBytes());

md.digest(srt.getBytes("Windows-31j"));

と、charsetNameを明示する事で同じになりました。。。よかったよ。java脳になりきれてないな。
全体としては以下な感じ。digest、byte配列で返さずに、ハッシュ文字列で返してくれればよかのになぁ。

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(str.getBytes("Windows-31j"));
StringBuffer buf = new StringBuffer();
for(int i= 0; i< digest.length; i++){
      int d = digest[i];
      if (d < 0) {
        d += 256;
      }
      if (d < 16) {
        buf.append("0");
      }
      buf.append(Integer.toString(d, 16));
      }
String result = buf.toString();


ちなみに比較用にrubyで試したのは下記。やっぱrubyが(ry

require 'kconv'
require 'digest/md5'

p Digest::MD5.hexdigest(Kconv.tosjis(str))
© harukazepc️