Il y a un moyen qui est assez inefficace en mémoire .
un seul fichier:
import hashlib
def file_as_bytes(file):
with file:
return file.read()
print hashlib.md5(file_as_bytes(open(full_path, 'rb'))).hexdigest()
liste des fichiers:
[(fname, hashlib.md5(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
Rappelez-vous cependant que MD5 est connu comme cassé et ne doit pas être utilisé à quelque fin que ce soit, car l'analyse de vulnérabilité peut être très délicate, et l'analyse de toute utilisation future possible de votre code pour des problèmes de sécurité est impossible. À mon humble avis, il devrait être retiré de la bibliothèque pour que tous ceux qui l'utilisent soient obligés de mettre à jour. Alors, voici ce que vous devriez faire à la place:
[(fname, hashlib.sha256(file_as_bytes(open(fname, 'rb'))).digest()) for fname in fnamelst]
Si vous ne voulez que 128 bits de résumé, vous pouvez le faire .digest()[:16]
.
Cela vous donnera une liste de tuples, chaque tuple contenant le nom de son fichier et son hachage.
Encore une fois, je remets fortement en question votre utilisation de MD5. Vous devriez au moins utiliser SHA1, et compte tenu des failles récentes découvertes dans SHA1 , probablement même pas. Certaines personnes pensent que tant que vous n'utilisez pas MD5 à des fins «cryptographiques», tout va bien. Mais les choses ont tendance à avoir une portée plus large que ce à quoi vous vous attendiez initialement, et votre analyse de vulnérabilité occasionnelle peut s'avérer complètement erronée. Il est préférable de prendre l'habitude d'utiliser le bon algorithme dès le départ. Il suffit de taper un groupe de lettres différent, c'est tout. Ce n'est pas si dur.
Voici un moyen plus complexe, mais efficace en mémoire :
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]
Et, encore une fois, puisque MD5 est cassé et ne devrait plus jamais être utilisé:
[(fname, hash_bytestr_iter(file_as_blockiter(open(fname, 'rb')), hashlib.sha256()))
for fname in fnamelst]
Encore une fois, vous pouvez mettre [:16]
après l'appel à hash_bytestr_iter(...)
si vous ne voulez que 128 bits de résumé.
md5sum
?