【发布时间】:2011-01-25 12:19:44
【问题描述】:
我正在尝试以 UTF-16 编码方案读取字符串并对其执行 MD5 散列。但奇怪的是,当我尝试这样做时,Java 和 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
我不确定,为什么输出不一样。我们如何改变上面这段代码,让它们都返回相同的输出?
【问题讨论】:
-
首先比较你的字节数组。如果它们甚至有一点不匹配,哈希值就会完全不同。 UTF-16 编码中可能有 BOM 或其他内容。它可能是小端或大端,或其他。
标签: c# java encoding md5 utf-16