python 2.7では、次のコードはファイルの内容のmD5の16進数を計算します。hashlibを使ってPython 3のファイルのmd5ダイジェストを計算する
(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を返すためです)。この動作はどこかで説明されていますか?
関連:http://stackoverflow.com/q/4949162/ – jfs
それがより速くなるでしょう、あなたは大規模で、ファイルシステムのファイルのブロック・サイズに近い読みましたか? (例えば、Linuxのext3では1024バイト、Windows NTFSでは4096バイト以上) – rakslice