TL; DR używają buforów, aby nie używać ton pamięci.
Myślę, że dochodzimy do sedna twojego problemu, gdy rozważymy implikacje pamięciowe pracy z bardzo dużymi plikami . Nie chcemy, aby ten zły chłopiec przerzucił 2 gigabajty pamięci RAM dla pliku o wielkości 2 gigabajtów, więc jak wskazuje pasztorpisti , musimy poradzić sobie z większymi plikami w kawałkach!
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()))
To, co zrobiliśmy, to aktualizowanie naszych skrótów tego złego chłopca w fragmentach 64kb, wraz z poręczną metodą aktualizacji hashlib . W ten sposób zużywamy o wiele mniej pamięci niż 2 GB potrzebne do zhaszowania faceta na raz!
Możesz to sprawdzić za pomocą:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
Mam nadzieję, że to pomoże!
Wszystko to jest również opisane w powiązanym pytaniu po prawej stronie: Pobierz skrót MD5 dużych plików w Pythonie
Uzupełnienie!
Generalnie, pisząc w Pythonie, warto nabrać nawyku podążania za pep-8 . Na przykład w pythonie zmienne są zwykle oddzielane podkreśleniem, a nie camelCased. Ale to tylko styl i nikogo tak naprawdę nie obchodzą te rzeczy, z wyjątkiem ludzi, którzy muszą czytać w złym stylu ... może to być Ty czytasz ten kod za lata.