C# 为什么我得到的是胡言乱语而不是散列值?

C# 为什么我得到的是胡言乱语而不是散列值?,c#,hash,md5,C#,Hash,Md5,下面是我的小助手方法,用于从字符串中获取哈希值。但我得到的是某种奇怪的文本,而不是散列值: public static string GetHashValue(string sourceString) { MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); return Encoding.UTF8.GetString(provider.Comput

下面是我的小助手方法,用于从字符串中获取哈希值。但我得到的是某种奇怪的文本,而不是散列值:

 public static string GetHashValue(string sourceString)
        {
            MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider();
            return Encoding.UTF8.GetString(provider.ComputeHash(Encoding.UTF8.GetBytes(sourceString)));
        }
我不认为我从这个函数得到的值实际上是散列值


提前感谢:)

您可能希望它显示为十六进制字符串。这是一种常见的表示,与您现在显示的内容不同。有关详细信息,请参阅

尝试对代码进行以下更改(改编自上述示例):

公共静态字符串GetHashValue(字符串源字符串)
{
MD5CryptoServiceProvider=新的MD5CryptoServiceProvider()
byte[]hashData=provider.ComputeHash(Encoding.UTF8.GetBytes(sourceString));
int i;
StringBuilder sOutput=新的StringBuilder(hashData.Length);
对于(i=0;i
您可能希望它显示为十六进制字符串。这是一种常见的表示,与您现在显示的内容不同。有关详细信息,请参阅

尝试对代码进行以下更改(改编自上述示例):

公共静态字符串GetHashValue(字符串源字符串)
{
MD5CryptoServiceProvider=新的MD5CryptoServiceProvider()
byte[]hashData=provider.ComputeHash(Encoding.UTF8.GetBytes(sourceString));
int i;
StringBuilder sOutput=新的StringBuilder(hashData.Length);
对于(i=0;i
使用UTF8.GetString()在这里没有意义,哈希函数不会返回utf-8编码的字符串。它只是一个具有任意字节值的字节[]。改为使用Convert.ToBase64String()。它仍然是狼吞虎咽,但它应该是。它是散列的。您可以使用Convert.FromBase64String()将其返回字节[]。

使用UTF8。GetString()在这里没有意义,哈希函数不会返回utf-8编码的字符串。它只是一个具有任意字节值的字节[]。改为使用Convert.ToBase64String()。它仍然是狼吞虎咽,但它应该是。它是散列的。您可以使用Convert.FromBase64String()将其返回字节[]。

那么,当您将其打印为输出时,会得到什么?如果你得到的东西只包含字母A到F和数字0到9,是的,那就是散列值。散列以字节为单位,你想把它转换成字符串表示吗?@BoltClock:-我没有得到字母A到F和数字0到9,这就是为什么我这边存在这个问题。我得到了??4??yEm3???@Kar Cheng:hmm,IIRC你不应该这样做
GetString()
。相关:那么当你把它打印成输出时,你得到了什么?如果你得到的东西只包含字母A到F和数字0到9,是的,那就是散列值。散列以字节为单位,你想把它转换成字符串表示吗?@BoltClock:-我没有得到字母A到F和数字0到9,这就是为什么我这边存在这个问题。我得到了??4??yEm3???@Kar Cheng:hmm,IIRC你不应该这样做
GetString()
。相关:-匆忙中你忘记了增加I。请看你的循环。但是没关系匆忙中你忘了增加i。请看你的循环。但是没关系!
 public static string GetHashValue(string sourceString)
 {
    MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider()
    byte[] hashData = provider.ComputeHash(Encoding.UTF8.GetBytes(sourceString));

    int i;
    StringBuilder sOutput = new StringBuilder(hashData.Length);
    for (i=0; i < hashData.Length; ++i)
    {
        sOutput.Append(hashData[i].ToString("X2"));
    }
    return sOutput.ToString();
 }