TL; DR usa búferes para no usar toneladas de memoria.
Llegamos al meollo de su problema, creo, cuando consideramos las implicaciones de memoria de trabajar con archivos muy grandes . No queremos que este chico malo agite 2 gigas de RAM para un archivo de 2 gigabytes, así que, como señala Pasztorpisti , ¡tenemos que lidiar con esos archivos más grandes en trozos!
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()))
Lo que hemos hecho es que estamos actualizando nuestros hash de este chico malo en trozos de 64 kb a medida que avanzamos con el práctico método de actualización de hashlib . ¡De esta manera usamos mucha menos memoria que los 2 GB que se necesitarían para hash al tipo de una vez!
Puedes probar esto con:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
¡Espero que ayude!
Además, todo esto se describe en la pregunta vinculada en el lado derecho: Obtenga hash MD5 de archivos grandes en Python
¡Apéndice!
En general, al escribir Python, ayuda a acostumbrarse a seguir pep-8 . Por ejemplo, en Python las variables suelen estar separadas por guiones bajos, no camelCased. Pero eso es solo estilo y nadie realmente se preocupa por esas cosas, excepto las personas que tienen que leer mal estilo ... que podría ser usted leyendo este código dentro de unos años.