Oui, je pense que le hachage du fichier serait le meilleur moyen si vous devez comparer plusieurs fichiers et stocker des hachages pour une comparaison ultérieure. Comme les hachages peuvent entrer en collision, une comparaison octet par octet peut être effectuée en fonction du cas d'utilisation.
En général, une comparaison octet par octet serait suffisante et efficace, ce que le module filecmp
fait déjà + d'autres choses aussi.
Voir http://docs.python.org/library/filecmp.html par exemple.
>>> import filecmp
>>> filecmp.cmp('file1.txt', 'file1.txt')
True
>>> filecmp.cmp('file1.txt', 'file2.txt')
False
Notez que par défaut, filecmp
ne compare pas le contenu des fichiers, pour le faire, ajoutez un troisième paramètre shallow=False
.
Considération de la vitesse: En général, si seulement deux fichiers doivent être comparés, les hacher et les comparer seraient plus lents que la simple comparaison octet par octet si elle est faite efficacement. par exemple le code ci-dessous essaie de mesurer le temps du hachage par rapport à l'octet par octet
Avertissement: ce n'est pas la meilleure façon de mesurer ou de comparer deux algorithmes et il y a besoin d'améliorations mais cela donne une idée approximative. Si vous pensez que cela devrait être amélioré, dites-le moi et je le changerai.
import random
import string
import hashlib
import time
def getRandText(N):
return "".join([random.choice(string.printable) for i in xrange(N)])
N=1000000
randText1 = getRandText(N)
randText2 = getRandText(N)
def cmpHash(text1, text2):
hash1 = hashlib.md5()
hash1.update(text1)
hash1 = hash1.hexdigest()
hash2 = hashlib.md5()
hash2.update(text2)
hash2 = hash2.hexdigest()
return hash1 == hash2
def cmpByteByByte(text1, text2):
return text1 == text2
for cmpFunc in (cmpHash, cmpByteByByte):
st = time.time()
for i in range(10):
cmpFunc(randText1, randText2)
print cmpFunc.func_name,time.time()-st
et la sortie est
cmpHash 0.234999895096
cmpByteByByte 0.0