Как отмечено в других ответах на ту же тему, убедиться смотреть панель DjangoCon 2008 Эволюции Схемы на YouTube.
кроме того, два новых проекта на карте: Simplemigrations и Миграционный .
Что ж, это скажет вам, действительно ли они разные или вероятно одинаковы. Возможно для двух файлов один и тот же хэш, но на самом деле не одинаковые данные ... просто очень маловероятно.
Каковы будут последствия в вашей ситуации, если вы получите ложное срабатывание (т. Е. Если вы думаете, что они такие же, но это не так)? MD5, вероятно, достаточно хорош, чтобы не беспокоиться о коллизиях, если они произойдут только случайно ... но если у вас на кону безопасность (или деньги) и кто-то может заложить "плохой" файл с тем же хэш как "хороший" файл, на него не стоит полагаться.
Лично я бы, вероятно, просто прочитал оба файла, сравнивая каждый байт - для одноразового сравнения, и хеширование, и этот подход потребуют чтения всего файла, когда они равны; как указывает Даниэль в комментариях, побайтовое сравнение позволяет выйти раньше, как только вы заметите разницу. Сравнение размеров файлов - еще одна быстрая оптимизация :)
Общее преимущество хеширования проявляется, когда вы где-то храните хэш существующего файла, так что в следующий раз вы можете просто прочитать новый файл.
Если вы хотите сделать больше, чем просто определить, отличаются ли они друг от друга, или не доверяете решению хеширования, существуют модули, называемые difflib и filecmp ], который не полагается на внешние программы.
Хэш полезен, если вы собираетесь кэшировать его (для сравнения множества разных файлов друг с другом). Если вы просто хотите сравнить два файла, это чудовищная трата циклов. В конце концов, оба файла будут считаны, и для каждого фрагмента будет использоваться много обработки.
Если это сравнение 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.
Если вы используете систему с md5sum, этого, вероятно, достаточно.
Вы можете сделать это с помощью стандартных библиотек Python - ознакомьтесь с hashlib
.
Зависит от того, комфортно ли вы себя чувствуете с вероятностью коллизии в алгоритме MD5. Только учтите, что это маловероятно: так что да, продолжайте.
Если никто не злонамеренно пытается создать коллизии, вам придется сравнить примерно 2 64 файлов, прежде чем вы ожидаете увидеть случайное столкновение . Однако кто-то может аккуратно сконструировать два файла с одинаковой суммой MD5 из-за криптографических слабостей в MD5 . Независимо от того, имеют ли значение криптографические слабости MD5 или нет, зависит от вашего приложения, от того, откуда берутся файлы, и от того, что злоумышленник может получить, если обманом заставит вашу программу думать, что два разных файла идентичны. MD5 по-прежнему является очень хорошей контрольной суммой, только не такой хорошей, как криптографический хеш.
Конечно, есть простой тест, который вы должны провести перед тем, как вообще сравнивать содержимое файла - если файлы имеют разные размеры, то они не могут быть одинаковыми.
Не будет ' t более эффективно просто читать каждый файл и выполнять побайтовое сравнение, полностью избегая алгоритма хеширования. Это позволяет избежать (очень маловероятной) вероятности того, что два разных файла создадут один и тот же хэш MD5. Более того, вы можете отказаться от сравнения, когда обнаружите первое различие, что для очень разных файлов будет происходить очень рано в сравнении (возможно на первом байте!)