Как определить, идентичны ли два файла в Python

Выполняет системный вызов «md5sum file1» и «md5sum file2» и сравнивает в этом случае два возвращаемых значения?

8 Solutions collect form web for “Как определить, идентичны ли два файла в Python”

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

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

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

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

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

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

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

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

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

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

Если это сравнение 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. 

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

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

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

Python - лучший язык программирования в мире.