В python 2.7 следующий код вычисляет шестнадцатеричный файл mD5 содержимого файла.
(РЕДАКТИРОВАТЬ: ну, не совсем так, как показали ответы, я просто так подумал).
import hashlib
def md5sum(filename):
f = open(filename, mode='rb')
d = hashlib.md5()
for buf in f.read(128):
d.update(buf)
return d.hexdigest()
Теперь, если я запустил этот код с помощью python3, он вызовет исключение TypeError:
d.update(buf)
TypeError: object supporting the buffer API required
Я понял, что могу заставить этот код работать с python2 и python3, изменив его на:
def md5sum(filename):
f = open(filename, mode='r')
d = hashlib.md5()
for buf in f.read(128):
d.update(buf.encode())
return d.hexdigest()
Теперь мне все еще интересно, почему исходный код перестал работать. Кажется, что при открытии файла с использованием модификатора двоичного режима он возвращает целые числа вместо строк, закодированных как байты (я говорю это, потому что type (buf) возвращает int). Это поведение где-то объясняется?