Solusi portabel Python 2/3
Untuk menghitung checksum (md5, sha1, dll.), Anda harus membuka file dalam mode biner, karena Anda akan menjumlahkan nilai byte:
Untuk menjadi py27 / py3 portable, Anda harus menggunakan io
paket, seperti ini:
import hashlib
import io
def md5sum(src):
md5 = hashlib.md5()
with io.open(src, mode="rb") as fd:
content = fd.read()
md5.update(content)
return md5
Jika file Anda besar, Anda mungkin lebih suka membaca file dengan potongan untuk menghindari menyimpan seluruh konten file dalam memori:
def md5sum(src, length=io.DEFAULT_BUFFER_SIZE):
md5 = hashlib.md5()
with io.open(src, mode="rb") as fd:
for chunk in iter(lambda: fd.read(length), b''):
md5.update(chunk)
return md5
Kuncinya di sini adalah menggunakan iter()
fungsi dengan sentinel (string kosong).
Iterator yang dibuat dalam kasus ini akan memanggil o [fungsi lambda] tanpa argumen untuk setiap panggilan ke next()
metodenya; jika nilai yang dikembalikan sama dengan sentinel, StopIteration
akan dinaikkan, jika tidak nilai akan dikembalikan.
Jika file Anda sangat besar, Anda mungkin juga perlu menampilkan informasi kemajuan. Anda dapat melakukannya dengan memanggil fungsi panggilan balik yang mencetak atau mencatat jumlah byte yang dihitung:
def md5sum(src, callback, length=io.DEFAULT_BUFFER_SIZE):
calculated = 0
md5 = hashlib.md5()
with io.open(src, mode="rb") as fd:
for chunk in iter(lambda: fd.read(length), b''):
md5.update(chunk)
calculated += len(chunk)
callback(calculated)
return md5