Глава 23 · Часть IV · Реализуем SafeSort

Поиск одинаковых файлов

Дорогое хеширование содержимого делается только там, где оно действительно может изменить ответ — после отбора по размеру.

SafeSort · Часть 4 из 6Реализация
GitHubIssue #9 · Project «SafeSort — первый релиз»
Add duplicate detection
Area: DuplicatesPriority: Medium
git switch -c feat/duplicate-detection

Второй крупный компонент SafeSort — поиск файлов с одинаковым содержимым. Задача выглядит просто: если у двух файлов одинаковые байты, они дубликаты. Наивное решение — сравнить содержимое каждого файла с содержимым каждого другого — работает, но для тысяч файлов означает чтение каждого файла снова и снова.

РазмерФайлы
100 KBa.jpg, b.jpg
240 KBreport.pdf (один файл — дальше не идёт)
3 MBvideo.mp4, video-copy.mp4

Дальше в проверку идут только группы из двух и более файлов — одиночный размер сразу отбрасывается, дублировать ему нечего.

Все файлысписок FileInfo отсканераГруппировка поsizeфайлы с уникальнымразмером сразуотбрасываютсяХеш SHA-256только для файловвнутри одной группыразмераГруппировка по(size, digest)совпадение — кандидатв дубликатыБайтовоеподтверждениекандидат становитсяподтверждённымдубликатом
Поэтапный поиск дубликатов: каждый следующий, более дорогой шаг применяется только к тому, что прошло предыдущий
Файл с уникальным размером не может быть дубликатом
Если размер файла не совпадает ни с одним другим файлом в просканированном каталоге, у него точно нет дубликата — и вычислять его хеш незачем. Эта проверка почти бесплатна (размер уже известен из FileInfo), а экономит она ровно то, что дороже всего — чтение и хеширование содержимого файлов.

Дальше — сама функция хеширования, а затем то, как результаты хеширования группируются в готовые группы дубликатов и проходят последнее, байтовое подтверждение.

Коротко

  • Поиск дубликатов идёт в четыре этапа: по размеру, по хешу, по паре (размер, хеш), затем байтовое подтверждение.
  • Хеш вычисляется только для файлов, у которых уже нашёлся хотя бы один файл того же размера.
  • duplicates() — read-only команда: она только сообщает о найденных группах, ничего не удаляя.