TL; DR menggunakan buffer untuk tidak menggunakan banyak memori.
Kami sampai ke inti masalah Anda, saya yakin, ketika kami mempertimbangkan implikasi memori dari bekerja dengan file yang sangat besar . Kami tidak ingin bocah nakal ini mengaduk-aduk 2 giga ram untuk file 2 gigabyte jadi, seperti yang ditunjukkan pasztorpisti , kami harus menangani file-file yang lebih besar itu dalam potongan!
import sys
import hashlib
BUF_SIZE = 65536
md5 = hashlib.md5()
sha1 = hashlib.sha1()
with open(sys.argv[1], 'rb') as f:
while True:
data = f.read(BUF_SIZE)
if not data:
break
md5.update(data)
sha1.update(data)
print("MD5: {0}".format(md5.hexdigest()))
print("SHA1: {0}".format(sha1.hexdigest()))
Apa yang telah kami lakukan adalah memperbarui hash kami dari bocah nakal ini dalam potongan 64kb saat kami mengikuti metode pembaruan keren yang berguna dari hashlib . Dengan cara ini kami menggunakan memori yang jauh lebih sedikit daripada 2gb yang diperlukan untuk melakukan hash sekaligus!
Anda dapat mengujinya dengan:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
Semoga membantu!
Juga semua ini diuraikan dalam pertanyaan terkait di sisi kanan: Dapatkan hash MD5 file besar dengan Python
Tambahan!
Secara umum saat menulis python, ada baiknya membiasakan diri mengikuti pep-8 . Misalnya, dalam variabel python biasanya dipisahkan garis bawah, bukan camelCased. Tapi itu hanya gaya dan tidak ada yang benar-benar peduli tentang hal-hal itu kecuali orang yang harus membaca gaya yang buruk ... yang mungkin Anda membaca kode ini bertahun-tahun dari sekarang.