javaでmd5を実装していたのだけど、他の言語で出来た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))