2009-02-11 2 views

Antwort

7

Hier ist eine modifizierte @ʞɔıu's answer mit @Jason S' suggestion.

from __future__ import with_statement 
from hashlib import md5, sha1 

filename = 'hash_one-pass.py' 

hashes = md5(), sha1() 
chunksize = max(4096, max(h.block_size for h in hashes)) 
with open(filename, 'rb') as f: 
    while True: 
     chunk = f.read(chunksize) 
     if not chunk: 
      break 
     for h in hashes: 
      h.update(chunk) 

for h in hashes: 
    print h.name, h.hexdigest() 
15

So etwas vielleicht?

>>> import hashlib 
>>> hashes = (hashlib.md5(), hashlib.sha1()) 
>>> f = open('some_file', 'r') 
>>> for line in f: 
...  for hash in hashes: 
...   hash.update(line) 
... 
>>> for hash in hashes: 
...  print hash.name, hash.hexdigest() 

oder Schleife über f.read (1024) oder so ähnlich Blöcken mit fester Länge

+0

, das wie es funktionieren würde aussieht, aber ich würde Bytes, die mit einer festen Blockgröße anstelle einer pro-Zeile-Basis (einige binäre Dateien dürfen keine Zeilenumbrüche) –

+0

f.readlines() erfordert ~ 100 MB, lesen, aber ein einfaches 'f' funktioniert (ein Dateiobjekt ist ein Iterator über Zeilen in Python) – jfs

+0

' für Zeile in f 'iteriert über * Zeilen * in der Datei. Wenn die Zeilengröße 1 MB beträgt, ist es egal, welche Puffergröße Sie verwenden. len (Linie) wird 2 ** 20 sein. Daher ist der 3. Parameter für das 'open()' in diesem Fall nicht nützlich. – jfs

3

zu bekommen Ich weiß, Python nicht, aber ich kenne w/Hash-Berechnungen.

Wenn Sie manuell mit dem Lesen von Dateien umgehen, lesen Sie nur einen Block (256 Bytes oder 4096 Bytes oder was auch immer) gleichzeitig und übergeben Sie jeden Datenblock, um den Hash jedes Algorithmus zu aktualisieren. (Sie müssen den Status am Anfang initialisieren und den Status am Ende abschließen.)

Verwandte Themen