Pour référence, voici une version plus concise:
def sha1OfFile(filepath):
import hashlib
with open(filepath, 'rb') as f:
return hashlib.sha1(f.read()).hexdigest()
À la réflexion: bien que je ne l'ai jamais vu, Je pense que f.read()
peut renvoyer moins que le fichier complet, ou pour un fichier de plusieurs gigaoctets, pour que f.read() manque de mémoire. Pour la gouverne de tous, nous allons examiner comment résoudre ce problème: Une première solution à cette question est:
def sha1OfFile(filepath):
import hashlib
sha = hashlib.sha1()
with open(filepath, 'rb') as f:
for line in f:
sha.update(line)
return sha.hexdigest()
Cependant, il n'y a aucune garantie que '\n'
apparaît dans le fichier du tout, donc le fait que la boucle for
nous donnera des blocs du fichier qui se terminent par '\n'
pourrait nous donner le même problème que nous avions à l'origine. Malheureusement, je ne vois pas de manière similaire à Python d'itérer sur des blocs du fichier aussi grand que possible, ce qui, je pense, signifie que nous sommes bloqués avec une boucle while True: ... break
et un nombre magique pour la taille du bloc:
def sha1OfFile(filepath):
import hashlib
sha = hashlib.sha1()
with open(filepath, 'rb') as f:
while True:
block = f.read(2**10) # Magic number: one-megabyte blocks.
if not block: break
sha.update(block)
return sha.hexdigest()
Bien sûr, qui peut dire que nous pouvons stocker des chaînes d'un mégaoctet. Nous pouvons probablement, mais que faire si nous sommes sur un ordinateur embarqué minuscule? J'aimerais pouvoir trouver un moyen plus propre de ne pas manquer de mémoire sur des fichiers énormes et qui ne possède pas de nombres magiques et qui fonctionne aussi bien que la solution Pythonic originale.
Vous ne pouvez pas vraiment ignorer la différence si vous prévoyez d'utiliser les hachages ensemble. –
Oublié de mentionner, juste utilisé git comme une référence, ne va pas les utiliser ensemble. – Ikke
Si le fichier peut être assez volumineux, vous pouvez le traiter un bloc à la fois, vous n'avez donc pas besoin de tout le contenu de la RAM à la fois: http://stackoverflow.com/questions/7829499/using-hashlib-to- compute-md5-digest-d'un fichier-dans-python3 – rakslice