Не полагайтесь на суммы MD5.
Суммы MD5 не являются надежным способом проверки на наличие дубликатов, они являются лишь способом проверки на наличие различий.
Используйте MD5 для поиска возможных дубликатов кандидатов , а затем для каждой пары, разделяющей MD5
- Открывает оба файла
- Ищет вперед в этих файлах, пока один не отличается.
Видя, что меня обижают люди, делающие наивные подходы к дублированию идентификатора файла. Если вы собираетесь полностью полагаться на алгоритм хеширования, ради бога, используйте что-то более жесткое, например SHA256 или SHA512, по крайней мере, вы уменьшите вероятность до разумная степень, проверяя больше битов. MD5 Чрезвычайно слаб для условий столкновения.
Я также советую людям читать списки рассылки здесь под названием «проверка файлов»: http://london.pm.org/pipermail/london.pm/Week-of-Mon-20080714/thread.html
Если вы говорите "MD5 может однозначно идентифицировать все файлы", то у вас логическая ошибка.
Учитывая диапазон значений, варьирующихся по длине от 40 000 байтов в длину до 100 000 000 000 байтов в длину, общее число комбинаций, доступных для этого диапазона, значительно превышает возможное количество значений, представленных MD5, с весом всего 128 битов.
Представлять 2 ^ 100 000 000 000 комбинаций только с 2 ^ 128 комбинациями? Я не думаю, что это вероятно.
Наименее Наивный путь
Наименее наивный и самый быстрый способ отсеять дубликаты заключается в следующем.
- По размеру : файлы с разным размером не могут быть идентичными. Это занимает мало времени, так как не нужно даже открывать файл.
- По MD5 : Файлы с разными значениями MD5/Sha не могут быть идентичными. Это занимает немного больше времени, потому что он должен прочитать все байты в файле и выполнить с ними математические операции, но он ускоряет несколько сравнений.
- При отсутствии вышеуказанных различий : Выполните побайтовое сравнение файлов. Это медленный тест для выполнения, поэтому его оставляют до тех пор, пока не будут учтены все другие устраняющие факторы.
Fdupes делает это. И вы должны использовать программное обеспечение, которое использует те же критерии.