Python 2.7では、次のコードはファイルのコンテンツのmD5hexdigestを計算します。
(編集:まあ、答えが示しているように実際にはそうではありません、私はちょうどそう思った)。
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を返すためです)。この動作はどこかで説明されていますか?