Как определить, идентичны ли два файла в Python - PullRequest
5 голосов
/ 17 ноября 2009

Достаточно ли системного вызова "md5sum file1" и "md5sum file2" и сравнить два возвращаемых значения в этом случае?

Ответы [ 8 ]

13 голосов
/ 17 ноября 2009

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

В вашей ситуации, каково влияние, если вы получаете ложный положительный результат (т.е. если вы думаете, что они одинаковы, но это не так)? MD5, вероятно, достаточно хорош, чтобы не беспокоиться о коллизиях, если они произойдут только случайно ... но если у вас на кону безопасность (или деньги), и кто-то может создать «плохой» файл с таким же хеш как "хороший" файл, на него не стоит полагаться.

Лично я, вероятно, просто прочитал бы оба файла, сравнив каждый байт - для одноразового сравнения и хеширование, и этот подход потребуют чтения всего файла, когда они равны; как указывает Даниэль в комментариях, побайтовое сравнение позволяет вам выйти раньше, как только вы увидите разницу. Сравнение размеров файлов сначала еще одна быстрая оптимизация:)

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

12 голосов
/ 17 ноября 2009

Если вы хотите сделать больше, чем просто определить, отличаются ли они, или не доверять решению хэширования, существуют модули с именами difflib и filecmp , которые не зависят от внешние программы.

7 голосов
/ 17 ноября 2009

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

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

3 голосов
/ 17 ноября 2009

Хеш полезен, если вы собираетесь его кэшировать (сравнивать много разных файлов друг с другом). Если вы просто хотите сравнить два файла, это чудовищная трата циклов. В конце концов - оба файла будут прочитаны, и на каждом кусочке будет использоваться много обработки.

Если это сравнение 1: 1, просто используйте:

import filecmp
filecmp.cmp(file_name_1,file_name_2)

С другой стороны, хороший хеш - единственный способ сравнить большое количество файлов друг с другом.

SHA-1 и MD5 вроде сломаны - но не для обычных файлов. Несколько исследователей могут создать 2 бессмысленных файла, которые могут конфликтовать, но маловероятно, что кто-либо сможет уничтожить существующий файл.

git использует SHA-1 для сравнения текста, так что это не страшный выбор.

Будет работать все следующее:

import hashlib
hash = hashlib.MD5(your_text_here).hexdigest() # safe*
hash = hashlib.SHA1(your_text_here).hexdigest() # safe*
hash = hashlib.SHA224(your_text_here).hexdigest() # safe
hash = hashlib.SHA512(your_text_here).hexdigest() # paranoid

# now put the hash in a dictionary (or database) for your many-to-many comparison.

#  * Meaningful files will not be clobbered. Contrived files can be generated
#    which might clash together, but it's difficult to do.
3 голосов
/ 17 ноября 2009

Если вы работаете в системе с md5sum, это, вероятно, достаточно хорошо.

Вы можете сделать это с помощью стандартных библиотек Python - оформить заказ hashlib.

0 голосов
/ 17 ноября 2009

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

0 голосов
/ 17 ноября 2009

Зависит, если вы чувствуете себя комфортно с вероятностью столкновения по алгоритму MD5. Просто отметьте, что это очень маловероятно: так что да, продолжайте.

0 голосов
/ 17 ноября 2009

да, достаточно

...