私はUTF-16エンコーディングスキームで文字列を読み込み、その上でMD5ハッシュを実行しようとしています。しかし、不思議なことに、JavaとC#は私がそれをやろうとすると、別の結果を返しています。JavaのUTF-16エンコーディングとC#
は、以下のJavaにおけるコードの一部である:
public static void main(String[] args) {
String str = "preparar mantecado con coca cola";
try {
MessageDigest digest = MessageDigest.getInstance("MD5");
digest.update(str.getBytes("UTF-16"));
byte[] hash = digest.digest();
String output = "";
for(byte b: hash){
output += Integer.toString((b & 0xff) + 0x100, 16).substring(1);
}
System.out.println(output);
} catch (Exception e) {
}
}
このため出力は:
次249ece65145dca34ed310445758e5504がC#におけるコードの一部であります
public static string GetMD5Hash()
{
string input = "preparar mantecado con coca cola";
System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
byte[] bs = System.Text.Encoding.Unicode.GetBytes(input);
bs = x.ComputeHash(bs);
System.Text.StringBuilder s = new System.Text.StringBuilder();
foreach (byte b in bs)
{
s.Append(b.ToString("x2").ToLower());
}
string output= s.ToString();
Console.WriteLine(output);
}
この出力は次のとおりです。c04d0f518ba2555977fa1ed7f93ae2b3
出力が同じでない理由はわかりません。上記のコードをどのように変更すれば、両方とも同じ出力を返すことができますか?
まず、バイト配列を比較してください。 1ビットでも不一致の場合、ハッシュは完全に異なります。 UTF-16エンコーディングにはBOMなどがあります。少しでも大きなエンディアンでも、何でもかまいません。 – maaartinus