Estoy tratando de leer un String en el esquema de codificación UTF-16 y realizar hash MD5 en él. Pero, curiosamente, Java y C# están devolviendo resultados diferentes cuando intento hacerlo.Codificación UTF-16 en Java contra C#
La siguiente es la pieza de código en 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) {
}
}
La salida de esto es: 249ece65145dca34ed310445758e5504
La siguiente es la pieza de código en 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);
}
La salida para esto es: c04d0f518ba2555977fa1ed7f93ae2b3
No estoy seguro, por qué las salidas no son las mismas. ¿Cómo cambiamos el fragmento de código anterior, para que ambos devuelvan el mismo resultado?
Compare primero sus matrices de bytes. Si no coinciden ni siquiera en un solo bit, los hashes son completamente diferentes. Puede haber una lista de materiales o lo que sea en la codificación UTF-16. Puede ser endian pequeño o grande, o lo que sea. – maaartinus