2010-08-27 96 views
2

我散列動作腳本中的一些數據,然後比較散列與C#中計算的散列,但它們不匹配。MD5散列在C#中不匹配MD5散列在行動腳本

任何人都知道爲什麼?

這是我在行動腳本做:

var hash : String = MD5.hash(theString); 

這裏就是我在C#中做:

var md5Hasher = MD5.Create(); 
    byte[] data = md5Hasher.ComputeHash(Encoding.UTF8.GetBytes(theSameString)); 
    var sBuilder = new StringBuilder(); 

    for (int i = 0; i < data.Length; i++) 
    { 
     sBuilder.Append(data[i].ToString("x2")); 
    } 
    var hash = sBuidler.ToString(); 

我想這是一個編碼的事情,但不能把我的手指就此...讓我知道!

-ev

回答

5

ActionScript必須使用不同的字符串編碼,但是我不清楚哪些(我嘗試谷歌,但它很難找到)。

因此,我建議您嘗試以下方法:

Console.WriteLine(ToHex(MD5.Create().ComputeHash(Encoding.UTF8.GetBytes("ä")))); 
Console.WriteLine(ToHex(MD5.Create().ComputeHash(Encoding.Unicode.GetBytes("ä")))); 
Console.WriteLine(ToHex(MD5.Create().ComputeHash(Encoding.GetEncoding("ISO-8859-1").GetBytes("ä")))); 

(當然,ToHex是,你已經寫把東西放進成十六進制:)

static string ToHex(byte[] data) 
{ 
    var sBuilder = new StringBuilder(); 
    for (int i = 0; i < data.Length; i++) 
     sBuilder.Append(data[i].ToString("x2")); 
    return sBuilder.ToString(); 
} 

再檢查功能看看你獲得的三個哈希中的哪一個與ActionScript中的哈希相同。然後你就會知道ActionScript使用哪種編碼。

+0

謝謝我使用你的建議找到正確的編碼。 事實證明: byte [] data = md5Hasher.ComputeHash(Encoding.GetEncoding(「ISO-8859-1」).GetBytes(input)); 是正確的。 謝謝! -Ev – 2010-08-27 05:49:39

0

字符串在ActionScript是UTF-16編碼。

+0

這與[聲明ActionScript使用UTF-8的早期關於MD5在ActionScript和PHP中的問題](http://stackoverflow.com/questions/2225474)上的公認答案矛盾。那麼誰是對的? – Timwi 2010-08-27 04:48:05

+0

請參閱[本](http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000047.html)。 – 2010-08-27 05:09:52

+0

在這種情況下,事實證明它被編碼爲ISO-8859-1 感謝您的幫助! – 2010-08-27 05:50:32