В 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). Это поведение где-то объяснено?