C'è un modo in cui la memoria è piuttosto inefficiente .
file singolo:
import hashlib
def file_as_bytes(file):
with file:
return file.read()
print hashlib.md5(file_as_bytes(open(full_path, 'rb'))).hexdigest()
elenco di file:
[(fname, hashlib.md5(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
Ricordiamo, tuttavia, che MD5 è noto non funzionante e non dovrebbe essere utilizzato per nessuno scopo poiché l'analisi della vulnerabilità può essere davvero complicata e analizzare qualsiasi possibile utilizzo futuro a cui il codice potrebbe essere sottoposto per problemi di sicurezza è impossibile. IMHO, dovrebbe essere rimosso dalla libreria in modo che tutti coloro che lo usano siano costretti ad aggiornare. Quindi, ecco cosa dovresti fare invece:
[(fname, hashlib.sha256(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
Se vuoi solo 128 bit di valore digest puoi farlo .digest()[:16]
.
Questo ti darà un elenco di tuple, ogni tupla contenente il nome del suo file e il suo hash.
Ancora una volta metto fortemente in dubbio il tuo utilizzo di MD5. Dovresti almeno usare SHA1, e dati i recenti difetti scoperti in SHA1 , probabilmente nemmeno quello. Alcune persone pensano che finché non usi MD5 per scopi "crittografici", stai bene. Ma le cose hanno la tendenza a finire per essere più ampie di quanto ti aspetti inizialmente, e l'analisi della tua vulnerabilità casuale potrebbe rivelarsi completamente imperfetta. È meglio prendere l'abitudine di usare l'algoritmo giusto fuori dal gate. Basta digitare un diverso gruppo di lettere è tutto. Non è così difficile.
Ecco un modo più complesso, ma efficiente in termini di memoria :
import hashlib
def hash_bytestr_iter(bytesiter, hasher, ashexstr=False):
for block in bytesiter:
hasher.update(block)
return hasher.hexdigest() if ashexstr else hasher.digest()
def file_as_blockiter(afile, blocksize=65536):
with afile:
block = afile.read(blocksize)
while len(block) > 0:
yield block
block = afile.read(blocksize)
[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.md5()))
for fname in fnamelst]
E, ancora una volta, poiché MD5 è rotto e non dovrebbe più essere utilizzato:
[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.sha256()))
for fname in fnamelst]
Ancora una volta, puoi mettere [:16]
dopo la chiamata hash_bytestr_iter(...)
se vuoi solo 128 bit di valore digest.
md5sum
?