Hashlib md5 в Python возвращает неправильные дайджесты для некоторых символов Юникода?Python

Программы на Python
Anonymous
Hashlib md5 в Python возвращает неправильные дайджесты для некоторых символов Юникода?

Сообщение Anonymous »

Я экспериментировал с реализацией MD5 в Python и Java и столкнулся с одной странностью, которая меня озадачила.

Следующий скрипт Python иллюстрирует проблему:

Код: Выделить всё

# -*- coding: utf-8 -*-
import hashlib

def md5hash(x):
m = hashlib.md5()
m.update(x)
return m.hexdigest()

print md5hash('\xdb')
print md5hash('Û')
Вывод:

Код: Выделить всё

98fd00d788afe2a5fa5e4f8e1666638b
31ecfb09f120720a55d96a2034f5d00b
Я ожидал, что эти два дайджеста будут эквивалентны, учитывая, что Û должен быть эквивалентен \xdb. Чтобы получить больше информации, я создал эквивалентную реализацию на Java:

Код: Выделить всё

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Test {
public static void main(String[] args) throws Exception {
MessageDigest m = MessageDigest.getInstance("MD5");

m.update("\u00db".getBytes());
System.out.println(bytesToHex(m.digest()));

m.update("Û".getBytes());
System.out.println(bytesToHex(m.digest()));
}

final protected static char[] hexArray = "0123456789abcdef".toCharArray();
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for ( int j = 0; j < bytes.length; j++ ) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
}
Вывод:

Код: Выделить всё

31ecfb09f120720a55d96a2034f5d00b
31ecfb09f120720a55d96a2034f5d00b
Вывод Java соответствует ожиданиям. Это наводит меня на мысль, что md5hash('\xdb') выводит неправильный результат, но я не уверен, что именно мне не хватает. Есть мысли?

Вернуться в «Python»