2011-05-17 493 views
3

我想從一個字符串生成哈希碼,例如「咖啡」,但我從python和c#得到的哈希碼是不同的,python就是我想要的python和c#中的字節字符串是相同的,但md5哈希碼是不同的

C#

String str = "咖啡"; 
MD5 m = MD5.Create(); 
byte[] data = m.ComputeHash(Encoding.Default.GetBytes(str)); 
StringBuilder sbuilder = new StringBuilder(); 
for(int i=0;i<data.Length;i++){ 
  sbuilder.Append(data[i].ToString("x2")); 
} 
byte[] hex = Encoding.Default.GetBytes(str); 
StringBuilder hex_builder = new StringBuilder(); 
foreach(byte a in hex){ 
  hex_builder.Append("{0:x2}",a); 
} 
//md5 hash code 
Response.Write(sbuilder.ToString()); 
//binary string 
Response.Write(hex_builder.ToString()); 

蟒蛇

#coding:utf8 
str = '咖啡' 
m = hashlib.md5() 
m.update(str) 
#md5 hashcode 
print m.hexdigest() 
#binary string 
print ' '.join(["%02x"%ord(x) for x in str]) 

二進制字符串是E5 92 96 E5 95 A1無論是在C#和python

MD5哈希碼

(C#)a761914f9760af3c112e24f08dea1b16

(蟒)3b7daa58a1fecdf5ba4d94d539fbb4d5

+0

c#將一個字節數組傳遞給ComputeHash,而python update包含字符串。你可以在Python中創建一個字節數組並將其傳遞給'update'? – russau 2011-05-17 07:57:18

+0

僅供參考 - 我剛剛在我的電腦上運行你的python代碼(python 2.5),並且我得到了'a761914f9760af3c112e24f08dea1b16'作爲散列 - 雖然我必須刪除#coding:utf8 – russau 2011-05-17 08:08:35

回答

5

的字符串編碼可能是不同的;因此當你將字符串轉換爲byte []時,你可能會得到不同的值。嘗試打印這些以查看它們是否相同。

+0

+1,我只是在回答中擴展了 – 2011-05-17 07:11:36

+0

我認爲.net中的默認編碼是utf16,也許我將python編碼設置爲utf8(#coding:utf8位於文件頂部),但字節數組相同:e5 92 96 e5 95 a1 – 2011-05-17 07:39:45

3

有同樣的問題。能夠將文本編碼爲「UTF-16LE」,並且C#和Python都產生了相同的結果。

def getMD5(text): 
    encoding = text.encode("UTF-16LE") 
    md5 = hashlib.md5() 
    md5.update(encoding) 
    return md5.hexdigest() 
相關問題