2011-01-30 45 views
0

这是我的小帮手方法从字符串中获取散列值。但是,我得到某种奇怪的文本,而不是哈希值:为什么我得到乱码而不是散列值?

public static string GetHashValue(string sourceString) 
     { 
      MD5CryptoServiceProvider provider = new MD5CryptoServiceProvider(); 
      return Encoding.UTF8.GetString(provider.ComputeHash(Encoding.UTF8.GetBytes(sourceString))); 
     } 

我不认为我从这个功能获得的价值确实是一个哈希值。提前:)

+1

那么当你打印输出时你会得到什么?如果你得到的东西只包含字母A到F和数字0到9,是的,那就是哈希值。 – BoltClock 2011-01-30 19:04:46

+0

散列是以字节为单位的,您是否试图将其转换为字符串表示形式? – 2011-01-30 19:09:07

回答

1

感谢您可能希望这是显示为十六进制的字符串。这是一种常见的表示形式,并且会与您现在显示的内容不同。有关详细信息,请参见the MSDN sample

尝试你的代码以下更改(改编自上面的示例):

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(); 
} 
2

使用UTF8.GetString()没有意义在这里,散列函数不返回编码的字符串UTF-8。它只是一个带有任意字节值的byte []。改用Convert.ToBase64String()。它仍然是大佬,但它应该是。它被哈希。您可以使用Convert.FromBase64String()将它返回到byte []。

相关问题