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#中的散列字符串是不可读的

您的c#结果看起来"奇怪",因为您已经将哈希的随机字节转换为UTF-8字符串。这不会产生任何漂亮的结果,因为许多字节值将映射到不可打印的字符。

您可能希望将哈希值转换为十六进制。为此,使用DatatypeConverter类:

return DatatypeConverter.printHexBinary(input);

我不确定c#的等效-但可以查看谷歌。


需要说明的是,当前c#代码的Java版本应该是:

return new String(input, "UTF-8");

当前您正在调用.toString(),这对于Java字节数组导致调用Object.toString()方法。这将打印对象的类型和哈希码,但不打印内容。