Это будет зависеть от файлов, которые вы сравниваете.
A) Наихудший сценарий:
- У вас много файлов одинакового размера
- Файлы очень большие
- Файлы очень похожи с различиями, обнаруженными в узком случайном месте в файле
Например, если у вас было:
- 100x 2 МБ файлов одинакового размера,
- сравнение друг с другом,
- с использованием двоичного сравнения с
- 50% чтения файла (вероятность нахождения неравного байта в первой половине файла)
Тогда вы бы получили:
- 10 000 сравнений
- 1 МБ, что равно
- всего 10 ГБ чтения.
Однако, если у вас был тот же сценарий, но сначала получил хэши файлов , вы бы:
- чтение 200 МБ данных с диска (как правило, самый медленный компонент в компьютере) с
- 1.6K в памяти (при использовании MD5 хэширование - 16 байт - безопасность не важна)
- и будет читать 2N * 2MB для окончательного прямого двоичного сравнения, где N - количество найденных дубликатов.
Я думаю, что наихудший сценарий не типичный хотя.
B) Типичный сценарий:
- Файлы обычно различаются по размеру
- Скорее всего, файлы будут отличаться в начале файла - это означает, что прямое двоичное сравнение обычно не предполагает считывание всего файла в большом количестве разных файлов одного размера.
Например, если у вас было:
- Папка файлов MP3 (они не становятся слишком большими - возможно, не больше 5 МБ)
- 100 файлов
- сначала проверка размера
- максимум 3 файла одинакового размера (дубликаты или нет)
- с использованием двоичное сравнение для файлов одинакового размера
- 99% может быть другим после 1 КБайт
Тогда вы бы получили:
- Не более 33 случаев, когда длина одинакова в 3 наборах файлов
- Параллельное двоичное чтение 3 файлов (или более возможно) одновременно в 4K кусках
- При обнаружении 0% дубликатов - 33 * 3 * 4 КБ для чтения файлов = 396 КБ для чтения на диске
- При найденных множителях 100% = 33 * 3 * N, где N - размер файла (~ 5 МБ) = ~ 495 МБ
Если вы ожидаете 100% -ное умножение, хеширование не будет более эффективным, чем прямое двоичное сравнение. Учитывая, что вы должны ожидать <100% кратных, хеширование будет менее эффективным, чем прямое двоичное сравнение. </p>
C) Повторное сравнение
Это исключение. Создание базы данных hash + length + path для всех файлов ускорит повторные сравнения. Но выгоды будут незначительными. Первоначально это потребует 100% чтения файлов и хранения хеш-базы данных. Новый файл должен быть прочитан на 100%, а затем добавлен в базу данных, и, если он сопоставлен, все равно потребуется прямое двоичное сравнение в качестве последнего шага сравнения (чтобы исключить коллизию хешей). Даже если большинство файлов имеют разные размеры, при создании нового файла в целевой папке он может соответствовать существующему размеру файла и может быть быстро исключен из прямого сравнения.
Заключить:
- Не следует использовать дополнительные хэши (конечный тест - двоичное сравнение - всегда должен быть финальным тестом)
- Двоичное сравнение часто более эффективно при первом запуске, когда имеется много файлов разного размера
- Сравнение MP3 хорошо работает с длиной, тогда как двоичное сравнение.