2017-09-10 69 views
1

我試圖練習C#編程。我試圖計算字符串「a」的MD5.has。但是,如何解決這個代碼,因爲它輸出4144e195f46de78a3623da7364d04f11而不是0cc175b9c0f1b6a831c399e269772661?如何在C#中計算「a」的MD5散列?

//Title of this code 
//Rextester.Program.Main is the entry point for your code. Don't change it. 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text.RegularExpressions; 

using System.Text; 
using System.Security.Cryptography; 

namespace Rextester 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      string a="a"; 
      Console.WriteLine(CalculateMD5Hash(a)); 
      Console.ReadKey(); 
     } 
     public static string CalculateMD5Hash(string input) 
     { 
      using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create()) 
      { 
       byte[] retval = md5.ComputeHash(Encoding.Unicode.GetBytes(input)); 
       StringBuilder sb = new StringBuilder(); 
       for (int i=0;i<retval.Length;++i) 
       { 
        sb.Append(retval[i].ToString("x2")); 
       } 
       return sb.ToString(); 
      } 

     } 
    } 
} 
+0

文本的編碼是否相同? –

+4

事實上:散列算法通常用於* binary *數據,而不是文本。你在這裏將文本轉換爲字節:'Encoding.Unicode.GetBytes(input)'。我的猜測是,使用'Encoding.Utf8'而不是'Encoding.Unicode'會給你你想要的答案,但是你需要明白「a」的MD5哈希值沒有被定義,因爲*「a」是文本,而不是字節。 –

回答

0

要獲得0cc175b9c0f1b6a831c399e269772661你只需要使用Encoding.UTF8

using (var md5 = System.Security.Cryptography.MD5.Create()) 
{ 
    byte[] hashValue = md5.ComputeHash(Encoding.UTF8.GetBytes(input)); 
    var sb = new StringBuilder(); 
    foreach (byte b in hashValue) 
     sb.Append(b.ToString("x2")); 
    return sb.ToString(); 
} 

請查看.NET使用UTF-16來編碼字符串的事實。