私はこれを完全に解決したわけではありませんが、うまくいけば、これらのヒントが役に立ちます:
Java では、md.digest() 呼び出しの直接の結果を取得すると、バイト配列になります。それを文字列表現に変換する代わりに、バイトを整数として出力するだけです。それらが次のとおりであることがわかります。
94 -66 34 -108 -20 -48 -32 -16 -114 -85 118 -112 -46 -90 -18 105
したがって、結果の文字列変換のダッシュは区切り記号ではなく、算術記号です。Java ハッシュは、バイト値を (符号付き) int として単純に連結したものです。
MD5('secret') を選択すると、32 桁の 16 進数の文字列が得られます。Java で各バイトを 16 進表現に変換して連結すると、MySQL が返すのと同じ文字列が得られることを確認しました。
したがって、MySQL で行う必要があるのは、Hex() の結果を (おそらく SUBSTRING() を使用して) 16 進文字ずつ反復処理し、それぞれを 10 進数に変換し、それらを連結することです。
編集 - ほぼ正しく実行しているように見えますが、16 進数の各ペアを int ではなく Byte に変換する必要があるため、たとえば、「0xbe」は 190 ではなく -66 です。
編集 #2 - MySQL でこれを行うのがいかに比較的難しいかに興味をそそられたので、私は固執しました (冗談のつもりでした)。次のストアド関数が機能しているようです。
drop function if exists java_md5;
delimiter |
create function java_md5(secret VARCHAR(255))
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
DECLARE result varchar(255);
DECLARE md5String char(255);
DECLARE pair char(2);
DECLARE pairInt int;
DECLARE idx int;
set md5String = MD5(secret);
set result = '';
set idx = 1;
WHILE(idx < 32) DO
set pair = substring(md5String, idx, 2);
set pairInt = ascii(unhex(pair));
set pairInt = if(pairInt > 127, pairInt - 256, pairInt);
set result = concat(result, pairInt);
set idx = idx + 2;
END WHILE;
RETURN result;
END|
delimiter ;
select java_md5('secret');