строка байтов одинакова в Python и C #, но хэш-код md5 отличается - PullRequest
4 голосов
/ 17 мая 2011

Я хочу сгенерировать хеш-код из строки, например, "咖啡", но хеш-код, который я получаю от python и c #, отличается, а тот, что от python, - то, что я хочу

с #

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 :

(с #) a761914f9760af3c112e24f08dea1b16

(питон) 3b7daa58a1fecdf5ba4d94d539fbb4d5

Ответы [ 2 ]

5 голосов
/ 17 мая 2011

Кодировка строки может отличаться; поэтому, когда вы конвертируете строку в byte [], вы, вероятно, получаете разные значения. Попробуйте распечатать их, чтобы увидеть, совпадают ли они.

4 голосов
/ 02 ноября 2012

Была такая же проблема.Был в состоянии закодировать текст как "UTF-16LE", и C # и Python оба дали тот же результат.

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