2014-06-24 6 views
5

Potrzebuję funkcji inteligentnego kopiowania, aby zapewnić niezawodne i szybkie kopiowanie plików & łączenie. Pliki są bardzo duże (od gigabajtów do ponad 200 GB) i rozprowadzane przez wiele folderów, w których ludzie zmieniają nazwy plików, a może foldery w ciągu dnia, więc chcę użyć skrótów, aby sprawdzić, czy już skopiowałem plik, może pod inną nazwę i w takim przypadku utwórz tylko link.Czy ta "szybka funkcja" jest niebezpieczna?

Im całkowicie nowy w mieszaja i używam tej funkcji tutaj hash:

import hashlib 

def calculate_sha256(cls, file_path, chunk_size=2 ** 10): 
    ''' 
    Calculate the Sha256 for a given file. 

    @param file_path: The file_path including the file name. 
    @param chunk_size: The chunk size to allow reading of large files. 
    @return Sha256 sum for the given file. 
    ''' 
    sha256 = hashlib.sha256() 
    with open(file_path, mode="rb") as f: 
     for i in xrange(0,16): 
      chunk = f.read(chunk_size) 
      if not chunk: 
       break 
      sha256.update(chunk) 
    return sha256.hexdigest() 

ten trwa jedną minutę do pliku 3GB, więc w końcu, proces może być bardzo powolny do 16 TB HD.

Teraz moim pomysłem jest wykorzystanie dodatkowej wiedzy o wewnętrznej strukturze plików, aby przyspieszyć działanie: Wiem, że zawierają mały nagłówek, a następnie wiele danych pomiarowych i wiem, że zawierają znaczniki czasu w czasie rzeczywistym, więc Jestem pewien, że szansa, że, powiedzmy, pierwsze 16 MB dwóch plików jest identyczne, jest bardzo niska (aby tak się stało, dwa pliki musiałyby zostać utworzone dokładnie w tym samym czasie w dokładnie takich samych warunkach środowiskowych) . Więc mój wniosek jest taki, że powinno wystarczyć, aby zaszeregować tylko pierwsze X MB każdego pliku.

Działa na moich przykładowych danych, ale ponieważ jestem niedoświadczony, chciałem tylko zapytać, czy jest coś, czego nie jestem świadomy (ukryte niebezpieczeństwo lub lepszy sposób na zrobienie tego).

Dziękuję bardzo!

+2

http://codereview.stackexchange.com/ – vaultah

+1

Musisz albo zrobić matematykę i zobaczyć, jak prawdopodobne jest, że masz niezamierzoną kolizję, albo musisz w jakiś sposób zagwarantować, że różne pliki * zawsze mają * inny nagłówek . W tym ostatnim przypadku możesz * na pewno * sprawdzić sumę tylko nagłówka. W pierwszym przypadku musisz sam zdecydować, czy prawdopodobieństwo kolizji jest czymś, z czym możesz żyć, czy nie. Trudno jest pomóc bez znajomości danych. –

+1

Możesz uniknąć ponownego odkrywania koła i używania [rsync] (http://en.wikipedia.org/wiki/Rsync). –

Odpowiedz

3

Możesz uzyskać skrót MD5 dużych plików, przez breaking them into small byte chunks.

Ponadto, obliczanie skrótów MD5 jest znacząco faster than SHA-256 i powinno być faworyzowane ze względu na wydajność dla każdej aplikacji, która nie korzysta z wartości skrótu dla celów bezpieczeństwa.

+0

Wziąłem wszystkie komentarze i odpowiedzi, dostarczone linki i teraz używam md5, hash pierwsze 16MB, i jeśli zauważę dwa pliki z tym samym hash, przeliczam ich hash na 32MB, następnie na 64MB, to .. ., aż albo hashe zaczną się różnić, jeden plik zgłasza EoF, ale drugi nie (biorąc pod uwagę, że te dwa przypadki "nie są równe") lub oba pliki zgłaszają EoF, a skrót jest taki sam (biorąc pod uwagę równe pliki). Dziękuję wam wszystkim! – Blutkoete