TL; DR utilizza buffer per non utilizzare tonnellate di memoria.
Arriviamo al nocciolo del tuo problema, credo, quando consideriamo le implicazioni sulla memoria del lavoro con file molto grandi . Non vogliamo che questo ragazzaccio sbandieri 2 giga di ram per un file da 2 gigabyte quindi, come fa notare pasztorpisti , dobbiamo occuparci di quei file più grandi in pezzi!
import sys
import hashlib
# BUF_SIZE is totally arbitrary, change for your app!
BUF_SIZE = 65536 # lets read stuff in 64kb chunks!
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()))
Quello che abbiamo fatto è che stiamo aggiornando i nostri hash di questo ragazzaccio in blocchi da 64kb mentre procediamo con il pratico metodo di aggiornamento dandy di hashlib . In questo modo usiamo molta meno memoria rispetto ai 2 GB necessari per hash il ragazzo tutto in una volta!
Puoi testarlo con:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
Spero che aiuti!
Anche tutto questo è delineato nella domanda collegata sul lato destro: Ottieni l'hash MD5 di file di grandi dimensioni in Python
Addendum!
In generale, quando si scrive python è utile prendere l'abitudine di seguire pep-8 . Ad esempio, in Python le variabili sono in genere separate da caratteri di sottolineatura non camelCased. Ma questo è solo stile e nessuno si preoccupa davvero di queste cose tranne le persone che devono leggere uno stile cattivo ... che potresti leggere questo codice tra anni.