SHA-256 i hash zawartości pliku
Ta sama treść zawsze daje ten sam skrót SHA-256. Odczyt bloków nie wymaga przechowywania całego pliku w pamięci jednocześnie.
Funkcja skrótu zamienia zawartość dowolnego pliku w
struna o stałej długości — skrót. SafeSort używa
SHA-256 z modułu hashlib: bajty identyczne
Zawsze podawaj ten sam skrót, a różne wersje gwarantują różne znaczenie
Content. Hashowanie many-to-one: możliwych wejść jest więcej niż 256-bitowych wyników, więc różne wejścia matematycznie mogą mieć ten sam skrót. Pasujący skrót służy jako silny filtr, ale nie dowodzi równości plików. Ponieważ SafeSort przenosi prawdziwe pliki użytkownika, nie zatrzymuje się na pasowaniu skrótu — następna strona pokazuje ostatni krok, który przekształca dopasowanie hasha w potwierdzony duplikat.
def sha256_stream(stream: BinaryIO, chunk_size: int = 1024 * 1024) -> str:
digest = hashlib.sha256()
while chunk := stream.read(chunk_size):
digest.update(chunk)
return digest.hexdigest()
Przy efekt lawiny mała zmiana wejścia zazwyczaj zmienia wiele bitów wyjścia; dla zachowania idealizowanego oczekuje się około połowy bitów wyjściowych. To nie oznacza, że w każdym doświadczeniu każda cyfra szesnastkowa musi się zmienić.
Dlaczego czytać plik częściowo
Cykl while chunk := file.read(chunk_size) czyta plik nie
w całości, a blokami po megabajcie, i każdy blok od razu dodaje do streszczenia przez
digest.update(). Jeśli funkcja odczyta plik w jednym wywołaniu
file.read(), dla pliku o powierzchni kilku gigabajtów na program
Musiałbyś przechowywać całą zawartość w pamięci RAM jednocześnie. W lekturze krok po kroku
W pamięci w danym momencie znajduje się tylko jeden blok, niezależnie od rozmiaru całego pliku.
>>> from pathlib import Path
>>> from safesort.duplicates import sha256_file
>>> sha256_file(Path("otchet.pdf"))
'784cc58b2286b83f67f58ffb1968ca4b80d1d0615863ad9b1ce9c3d05666f4e'