С python 2.7 следующий код вычисляет mD5 hexdigest содержимого файла.
(EDIT: ну, не так, как показали ответы, я так и думал).
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). Является ли это поведение объясненным где-то?