Rozdział 23 · Część IV · Wdrażamy SafeSort

Znajdź identyczne pliki

Kosztowne haszowanie treści odbywa się tylko wtedy, gdy faktycznie może zmienić odpowiedź – po zaznaczeniu według rozmiaru.

SafeSort · Część 4 z 6Wdrożenie
GitHubIssue #9 · Project SafeSort Pierwsze wydanie
Add duplicate detection
Area: DuplicatesPriority: Medium
git switch -c feat/duplicate-detection

Drugim głównym elementem SafeSort jest wyszukiwanie plików o tej samej treści. Zadanie Wygląda to prosto: jeśli dwa pliki mają te same bajty, są duplikatami. Naiwne rozwiązanie jest Porównaj zawartość każdego pliku z zawartością każdego innego pliku – działa, ale dla tysięcy pliki oznaczają czytanie każdego pliku w kółko.

RozmiarPliki
100 KBa.jpg, b.jpg
240 KBreport.pdf (jeden plik nie prowadzi dalej)
3 MBvideo.mp4, video-copy.mp4

Sprawdzane są tylko grupy dwóch lub więcej plików — pojedynczy rozmiar jednocześnie jest odrzucana, nie ma czego powielać.

Wszystkie plikilista FileInfo odskaneraGrupowanie wedługsizepliki z unikalnymnatychmiastowy rozmiarsą odrzucaneHash SHA-256tylko dla plikóww jednej grupierozmiarGrupowanie według(size, digest)przypadek jest kandydatemdo duplikatówBytepotwierdzeniekandydat staje siępotwierdzoneduplikat
Poszukiwanie duplikatów krok po kroku: każdy kolejny, droższy krok dotyczy tylko tego, co przeszło poprzedni
Plik o unikalnym rozmiarze nie może być duplikatem
Jeśli rozmiar pliku nie zgadza się z żadnym innym plikiem w przeskanowanym katalogu, na pewno nie ma duplikatu — i nie trzeba liczyć jego hasha. To sprawdzenie jest prawie darmowe (rozmiar jest już znany z FileInfo), i zapisuje dokładnie to, co jest najdroższe — czytanie i haszowanie zawartości plików.

Następnie jest sama funkcja skrótu, a następnie to, jak haszowanie wychodzi są grupowane w gotowe grupy duplikatów i przekazują ostatnie, bajtowe potwierdzenie.

Krótko

  • Poszukiwanie duplikatów przebiega w czterech etapach: według rozmiaru, według skrótu, według pary (rozmiar, skrót), a następnie potwierdzenia bajtów.
  • Skrót jest obliczany tylko dla plików, które już mają co najmniej jeden plik o tym samym rozmiarze.
  • duplicates() to read-only komenda: raportuje tylko znalezione grupy, bez usuwania czegokolwiek.