TL; DR verwenden Puffer, um nicht Tonnen von Speicher zu verwenden.
Ich glaube, wir kommen zum Kern Ihres Problems, wenn wir die Auswirkungen des Arbeitens mit sehr großen Dateien auf den Speicher betrachten . Wir wollen nicht, dass dieser böse Junge 2 Gigs RAM für eine 2-Gigabyte-Datei durchläuft , also müssen wir , wie Pasztorpisti betont , mit diesen größeren Dateien in Stücken umgehen!
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()))
Was wir getan haben, ist, dass wir unsere Hashes dieses bösen Jungen in 64-KB-Blöcken aktualisieren, während wir die praktische Dandy- Aktualisierungsmethode von hashlib befolgen . Auf diese Weise verbrauchen wir viel weniger Speicher als die 2 GB, die nötig wären, um den Kerl auf einmal zu hacken!
Sie können dies testen mit:
$ mkfile 2g bigfile
$ python hashes.py bigfile
MD5: a981130cf2b7e09f4686dc273cf7187e
SHA1: 91d50642dd930e9542c39d36f0516d45f4e1af0d
$ md5 bigfile
MD5 (bigfile) = a981130cf2b7e09f4686dc273cf7187e
$ shasum bigfile
91d50642dd930e9542c39d36f0516d45f4e1af0d bigfile
Hoffentlich hilft das!
All dies wird auch in der verknüpften Frage auf der rechten Seite beschrieben: Holen Sie sich MD5-Hash von großen Dateien in Python
Nachtrag!
Im Allgemeinen hilft es beim Schreiben von Python, sich daran zu gewöhnen, pep-8 zu folgen . Beispielsweise werden in Python Variablen normalerweise durch Unterstriche getrennt und nicht camelCased. Aber das ist nur Stil und niemand kümmert sich wirklich um diese Dinge, außer Menschen, die schlechten Stil lesen müssen ... vielleicht lesen Sie diesen Code in Jahren.