2015-08-03 2 views
1

Так что мне нужно сравнить два больших набора файлов данных, в частности аудиофайлы друг против друга, чтобы увидеть, есть ли на коленях. Каждый набор данных - 50 000+ файлов. Итак, что я сделал, создается список основных файлов для чтения python, затем мой скрипт открывает каждый файл, запускает хэш в файле и добавляет его в set(). Тогда я вижу, пересекаются ли эти два множества. Довольно просто, хотя вычислительное время длительное, но не вызывает беспокойства по этой проблеме.MD5 хеширование с hashlib производит несоответствия

Теперь, чтобы проверить свой сценарий, я решил скопировать две папки с аудио в них в двух разных местах на моей локальной машине и запустить мой скрипт и посмотреть, может ли он понять, что две папки одинаковы. Мой код:

hasher = hashlib.md5() 

with open("/Users/tcrha/Desktop/Music/hashmaster.txt") as inFile: 
    for line in inFile: 
     nline = line.strip('\n') 
     print nline 
     with open(nline) as handle: 
      buf = handle.read() 
      hasher.update(buf) 
      print hasher.hexdigest() 

with open("/Users/tcrha/Downloads/Music/hashmaster.txt") as inFile: 
    for line in inFile: 
     nline = line.strip('\n') 
     print nline 
     with open(nline) as handle: 
      buf = handle.read() 
      hasher.update(buf) 
      print hasher.hexdigest() 

Выход:

/Users/tcrha/Desktop/Music/Voodoo Glow Skulls/Band Geek Mafia/04 They Always Come Back.mp3 
61a89ad11775654a0c469973bc3afc4a 
/Users/tcrha/Downloads/Music/Voodoo Glow Skulls/Band Geek Mafia/04 They Always Come Back.mp3 
ba5cbe0137dcebebd344942196e2fd5a 

Как вы можете видеть оба хэша разные, даже думал, что они такие же файл. Теперь, когда я запускаю команду MD5, я получаю правильный вывод.

MD5 (/Users/tcrha/Desktop/Music/Voodoo Glow Skulls/Band Geek Mafia/04 They Always Come Back.mp3) = 
61a89ad11775654a0c469973bc3afc4a 

MD5 (/Users/tcrha/Downloads/Music/Voodoo Glow Skulls/Band Geek Mafia/04 They Always Come Back.mp3) = 
61a89ad11775654a0c469973bc3afc4a 

Что соответствует выходному сигналу первого блока кода в моем сценарии. Я что-то делаю неправильно.

+0

Вы продолжаете обновлять один и тот же «хэш» в своих двух блоках. Если вы используете два разных 'хэша ', я подозреваю, что вы получите тот же результат. – Dannnno

ответ

2

Вы определяете hasher один раз в верхней части своей программы, а затем используете его для хэша двух файлов. A hashlib.md5 экземпляр вычисляет хеш md5 в потоке всего байтов, которые были предоставлены. Поэтому для второго файла он возвращает hash(file1 + file2) вместо hash(file2).

Вы должны создать новый hashlib.md5 для каждого нового файла, который вы используете.

+0

да, я просто понял это приветствие – thomascrha

0

Вы повторно используете свой объект hasher. Вам нужно создать новый для каждого файла.

Смежные вопросы