Глава 23 · Часть IV · Реализуем SafeSort
Поиск одинаковых файлов
Дорогое хеширование содержимого делается только там, где оно действительно может изменить ответ — после отбора по размеру.
SafeSort · Часть 4 из 6Реализация
Add duplicate detection
Area: DuplicatesPriority: Medium
git switch -c feat/duplicate-detection
Второй крупный компонент SafeSort — поиск файлов с одинаковым содержимым. Задача выглядит просто: если у двух файлов одинаковые байты, они дубликаты. Наивное решение — сравнить содержимое каждого файла с содержимым каждого другого — работает, но для тысяч файлов означает чтение каждого файла снова и снова.
| Размер | Файлы |
|---|---|
| 100 KB | a.jpg, b.jpg |
| 240 KB | report.pdf (один файл — дальше не идёт) |
| 3 MB | video.mp4, video-copy.mp4 |
Дальше в проверку идут только группы из двух и более файлов — одиночный размер сразу отбрасывается, дублировать ему нечего.
Файл с уникальным размером не может быть дубликатом
Если размер файла не совпадает ни с одним другим файлом в просканированном каталоге, у него точно нет дубликата — и вычислять его хеш незачем. Эта проверка почти бесплатна (размер уже известен из
FileInfo), а экономит она ровно то, что дороже всего — чтение и хеширование содержимого файлов.Дальше — сама функция хеширования, а затем то, как результаты хеширования группируются в готовые группы дубликатов и проходят последнее, байтовое подтверждение.
Коротко
- Поиск дубликатов идёт в четыре этапа: по размеру, по хешу, по паре (размер, хеш), затем байтовое подтверждение.
- Хеш вычисляется только для файлов, у которых уже нашёлся хотя бы один файл того же размера.
- duplicates() — read-only команда: она только сообщает о найденных группах, ничего не удаляя.