2011-01-30 83 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 []。

相關問題