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

Как отмечено в других ответах на ту же тему, убедиться смотреть панель DjangoCon 2008 Эволюции Схемы на YouTube.

кроме того, два новых проекта на карте: Simplemigrations и Миграционный .

6
задан MSalters 17 November 2009 в 13:40
поделиться

8 ответов

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

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

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

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

13
ответ дан 8 December 2019 в 02:24
поделиться

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

13
ответ дан 8 December 2019 в 02:24
поделиться

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

Если это сравнение 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.
4
ответ дан 8 December 2019 в 02:24
поделиться

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

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

]
3
ответ дан 8 December 2019 в 02:24
поделиться

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

0
ответ дан 8 December 2019 в 02:24
поделиться

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

0
ответ дан 8 December 2019 в 02:24
поделиться

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

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

7
ответ дан 8 December 2019 в 02:24
поделиться

да, хватит

-2
ответ дан 8 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: