Ich möchte, dass Python dem EOF vorliest, damit ich einen geeigneten Hash erhalten kann, egal ob es sich um sha1 oder md5 handelt. Bitte helfen Sie. Folgendes habe ich bisher:
import hashlib
inputFile = raw_input("Enter the name of the file:")
openedFile = open(inputFile)
readFile = openedFile.read()
md5Hash = hashlib.md5(readFile)
md5Hashed = md5Hash.hexdigest()
sha1Hash = hashlib.sha1(readFile)
sha1Hashed = sha1Hash.hexdigest()
print "File Name: %s" % inputFile
print "MD5: %r" % md5Hashed
print "SHA1: %r" % sha1Hashed
file.read()
macht es - lesen Sie die gesamte Datei.read()
Methode steht?Antworten:
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!
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:
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.
quelle
BUF_SIZE
?shasum
Binärdateien. Die andere unten aufgeführte Antwort (die mit Memoryview) ist mit anderen Hashing-Tools kompatibel.Für die korrekte und effiziente Berechnung des Hashwerts einer Datei (in Python 3):
'b'
zum Dateimodus hinzufügen ), um Probleme mit der Zeichenkodierung und der Konvertierung am Zeilenende zu vermeiden.readinto()
diese Option, um eine Pufferumwandlung zu vermeiden.Beispiel:
quelle
resource.getpagesize
hier von Nutzen, wenn wir versuchen wollten, es etwas dynamisch zu optimieren? Und was ist mitmmap
?Ich würde einfach vorschlagen:
Alle anderen Antworten hier scheinen zu kompliziert zu sein. Python puffert bereits beim Lesen (in idealer Weise, oder Sie konfigurieren diese Pufferung, wenn Sie mehr Informationen über den zugrunde liegenden Speicher haben). Daher ist es besser, Chunks einzulesen, die die Hash-Funktion als ideal erachtet, wodurch sie schneller oder zumindest weniger CPU-intensiv ist Berechnen Sie die Hash-Funktion. Anstatt die Pufferung zu deaktivieren und zu versuchen, sie selbst zu emulieren, verwenden Sie die Python-Pufferung und steuern, was Sie steuern sollten: Was der Verbraucher Ihrer Daten für die ideale Hash-Blockgröße hält.
quelle
hash.block_size
wird genauso dokumentiert wie die 'interne Blockgröße des Hash-Algorithmus'. Hashlib nicht finden es ideal . Nichts in der Paketdokumentation deutet darauf hin, dass Eingaben in der Größeupdate()
bevorzugthash.block_size
werden. Es verbraucht nicht weniger CPU, wenn Sie es so nennen. Ihrfile.read()
Aufruf führt zu vielen unnötigen Objekterstellungen und überflüssigen Kopien aus dem Dateipuffer in Ihr neues Chunk-Byte-Objekt.block_size
. Wenn Sie sie nicht in diesen Blöcken bereitstellen, müssen sie puffern und warten, bis genügend Daten angezeigt werden, oder bestimmte Daten intern in Blöcke aufteilen. Sie können das also nur von außen erledigen und dann vereinfachen, was intern passiert. Ich finde das ideal. Siehe zum Beispiel: stackoverflow.com/a/51335622/252025block_size
ist viel kleiner als jede nützliche Lesegröße. Alle nützlichen Block- und Lesegrößen sind Zweierpotenzen. Somit ist die Lesegröße für alle Lesevorgänge mit Ausnahme des möglicherweise letzten durch die Blockgröße teilbar. Beispielsweise beträgt die sha256-Blockgröße 64 Byte. Dies bedeutet, dassupdate()
die Eingabe direkt verarbeitet werden kann, ohne dass ein Vielfaches von gepuffert werden mussblock_size
. Nur wenn der letzte Lesevorgang nicht durch die Blockgröße teilbar ist, muss er einmal bis zu 63 Byte puffern. Daher ist Ihr letzter Kommentar falsch und unterstützt nicht die Behauptungen, die Sie in Ihrer Antwort machen.Ich habe ein Modul programmiert, das große Dateien mit verschiedenen Algorithmen hashen kann.
Verwenden Sie das Modul wie folgt:
quelle
Hier ist eine Python 3, POSIX-Lösung (nicht Windows!), Mit der
mmap
das Objekt in den Speicher abgebildet wird.quelle
quelle
echo $USER_INPUT | md5sum > encrypted.txt && cat encrypted.txt
was sich nicht mit dem Hashing von Dateien befasst, insbesondere nicht mit großen.