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

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.

SafeSort · Część 4 z 6Wdrożenie
Bajty plikucałą treśćSHA-256hashlib.sha256()64 hex- postaciskrót

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.

src/safesort/duplicates.py
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()
Haszowanie i szyfrowanie rozwiązują różne problemy
SHA-256 zaprojektowane tak, że wyszukiwanie preobrazów w digest jest w praktyce niemożliwe obliczeniowo. Jest to właściwość inżynierska trwałości, a nie matematyczne stwierdzenie "niemożliwe do odwrócenia". Funkcja skrótu pomaga odpowiedzieć na pytanie "czy to ta sama treść" zamiast ją ukrywać. SafeSort używa SHA-256 wyłącznie do porównywania plików, a nie do ochrony danych.

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.

Sprawdzenie ręczne
>>> from pathlib import Path
>>> from safesort.duplicates import sha256_file
>>> sha256_file(Path("otchet.pdf"))
'784cc58b2286b83f67f58ffb1968ca4b80d1d0615863ad9b1ce9c3d05666f4e'
Praktyka: Hashuj zawartość na części
Interaktywny Laptop w przeglądarce: Python 3.14 przez Pyodide, bez instalacji
Otwórz praktykę →
Oficjalna dokumentacja
hashlib — Secure hashes and message digests
NIST FIPS 180-4 — Secure Hash Standard