TL; DR usam buffers para não usar toneladas de memória.
Chegamos ao cerne do seu problema, acredito, quando consideramos as implicações de memória de trabalhar com arquivos muito grandes . Não queremos que esse bad boy misture 2 GB de RAM por um arquivo de 2 GB, então, como pasztorpisti aponta, temos que lidar com esses arquivos maiores em pedaços!
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()))
O que fizemos foi atualizar nossos hashes desse bad boy em pedaços de 64kb conforme seguimos com o prático método de atualização dândi do hashlib . Dessa forma, usamos muito menos memória do que os 2 GB que seriam necessários para fazer o hash do cara de uma vez!
Você pode testar isso com:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
Espero que ajude!
Além disso, tudo isso é descrito na pergunta vinculada no lado direito: Obtenha hash MD5 de arquivos grandes em Python
Termo aditivo!
Em geral, ao escrever python, ajuda a adquirir o hábito de seguir o pep-8 . Por exemplo, em Python, as variáveis são normalmente separadas por sublinhado e não por camelCased. Mas isso é apenas estilo e ninguém realmente se preocupa com essas coisas, exceto as pessoas que têm que ler um estilo ruim ... que pode ser você lendo este código daqui a alguns anos.