c#中的散列字符串是不可读的
本文关键字:字符串 | 更新日期: 2023-09-27 18:09:25
我正在尝试在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文本框中,输出如下:"" ' ?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#中看起来那么奇怪?
您的c#结果看起来"奇怪",因为您已经将哈希的随机字节转换为UTF-8字符串。这不会产生任何漂亮的结果,因为许多字节值将映射到不可打印的字符。
您可能希望将哈希值转换为十六进制。为此,使用DatatypeConverter
类:
return DatatypeConverter.printHexBinary(input);
我不确定c#的等效-但可以查看谷歌。
需要说明的是,当前c#代码的Java版本应该是:
return new String(input, "UTF-8");
当前您正在调用.toString()
,这对于Java字节数组导致调用Object.toString()
方法。这将打印对象的类型和哈希码,但不打印内容。