我正在尝试在C#和Java中散列相同的字符串。
C#哈希方法:
public static string hashValue (string value)
{
byte[] input = null;
HashAlgorithm digest = HashAlgorithm.Create("SHA-512");
input = digest.ComputeHash(Encoding.UTF8.GetBytes(value));
return System.Text.UTF8Encoding.UTF8.GetString(input);
}
WPF TextBox中的输出看起来像是:“” ?N [ “ 2 D j t!z}7 H p J GƼOp EnBfHڄ X 。“。
在Java中,相同的函数返回结果:“[B @ 41e2db20”。
这样的Java哈希方法:
public static String hashValue(String value) {
byte[] input = null;
MessageDigest digest;
try {
digest = MessageDigest.getInstance("SHA-512");
try {
input = digest.digest(value.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
return input.toString();
}
你能告诉我我做错了什么吗?为什么结果在C#中看起来很奇怪?
答案 0 :(得分:3)
你的C#结果看起来很奇怪"因为您已将哈希的随机字节转换为UTF-8字符串。这不会导致任何漂亮的外观,因为许多字节值将映射到不可打印的字符。
您可能希望将哈希转换为十六进制。为此,请使用DatatypeConverter
类:
return DatatypeConverter.printHexBinary(input);
我不确定C#是否相同 - 但请查看Google。
对于记录,当前C#代码的Java等价物将是:
return new String(input, "UTF-8");
目前您正在调用.toString()
,对于Java字节数组,它会调用Object.toString()
方法。这将打印对象的类型和哈希码,但不打印内容。