2011-06-17 12 views
8

Wykonuję kod przetwarzania obrazu, w którym pobieram niektóre obrazy (jako BufferedImage) z adresów URL i przesyłam je do procesora obrazu.Aby sprawdzić, czy dwa pliki graficzne są takie same, czy nie .Checksum lub Hash?

Chcę uniknąć przekazywania tego samego obrazu więcej niż raz do procesora obrazu (ponieważ operacja przetwarzania obrazu jest bardzo kosztowna). Punkty końcowe URL-i (jeśli są to te same obrazy) mogą się różnić, a więc mogę temu zapobiec przez adres URL. Więc planowałem zrobić sumę kontrolną lub haszować, aby zidentyfikować, czy kod znów napotyka ten sam obraz.

Dla md5 wypróbowałem Fast MD5 i wygenerowałem sześciokątną wartość sumy kontrolnej o długości 20K + dla obrazu (część próbki). Oczywiście przechowywanie tego skrótu znaków 20K + byłoby problemem, jeśli chodzi o przechowywanie bazy danych. Dlatego próbowałem CRC32 (z java.util.zip.CRC32). I wygenerował sumę kontrolną o znacznie mniejszej długości niż wartość skrótu.

Rozumiem sumę kontrolną i hasz dla różnych celów. W celu wyjaśnionym powyżej mogę po prostu użyć CRC32? Czy to rozwiąże ten cel, czy muszę spróbować czegoś więcej niż tych dwóch?

Dzięki Abi

+1

[suma kontrolna i mieszania są takie same] (http://en.wikipedia.org/wiki/Checksum). Właściwie wystarczy spojrzeć na różne algorytmy. –

+1

128-bitowy skrót MD5 powinien wystarczyć dla twojego celu. – Thor

+5

BTW - MD5 należy utworzyć 128 bitową wartość hash natomiast CRC32 ma 32 bitów ... Co zrobiliście, aby wygenerować 20k + Szerokość kontrolne sześciokątne? –

Odpowiedz

1

Suma kontrolna i hash są w zasadzie takie same. Powinieneś być w stanie obliczyć dowolny rodzaj skrótu. Normalnie MD5 zwykle wystarczy. Jeśli chcesz, możesz zapisać rozmiar i sumę kontrolną md5 (czyli 16 bajtów, jak sądzę).

Jeśli dwa pliki mają różne rozmiary, są to różne pliki. Nie musisz nawet obliczać wartości mieszania dla danych. Jeśli jest mało prawdopodobne, że masz wiele zduplikowanych plików, a pliki są większego rodzaju (np. Zdjęcia JPG zrobione aparatem fotograficznym), ta optymalizacja może zaoszczędzić wiele czasu.

Jeśli dwa lub więcej plików ma ten sam rozmiar, można obliczyć wartości mieszania i porównać je.

Jeśli dwa skróty są takie same, można porównać rzeczywiste dane, aby sprawdzić, czy jest inaczej. Jest to bardzo, bardzo mało prawdopodobne, ale teoretycznie możliwe. Im większy twój hash (md5 ma 16 bajtów, a CR32 ma tylko 4), tym mniej prawdopodobne jest, że dwa różne pliki będą miały ten sam skrót. Potrwa jednak tylko 10 minut programowania, aby wykonać to dodatkowe sprawdzenie, więc powiedziałbym: lepiej to, niż przepraszam. :)

Aby jeszcze bardziej zoptymalizować to, jeśli dokładnie dwa pliki mają ten sam rozmiar, można po prostu porównać ich dane. Będziesz musiał przeczytać pliki mimo to, aby obliczyć swoje skróty, więc dlaczego nie porównać ich bezpośrednio, jeśli są jedynymi dwoma o tym określonym rozmiarze.

+0

Może być problem z przechowywaniem plików już przetworzonych, aby porównać je z nowymi Suma kontrolna lub hash zajmuje znacznie mniej miejsca – SJuan76

+0

To prawda - nigdy nie chciałem przechowywać całego pliku w bazie danych dla porównania - po prostu mówiąc, że w przypadku pojedynczego uruchomienia nie będzie konieczne obliczanie skrótu. przechowywać dane w celu sprawdzenia nowo dodane pliki, to ma sens do przechowywania hash, czy można wybrać do przechowywania tylko rozmiar pliku i obliczyć (i przechowywać) hash tylko wtedy, gdy dwa pliki siz es mecz. Pozwoli to zaoszczędzić miejsce i zaoszczędzić miejsce na dysku. – GolezTrol

5

Różnica między CRC i, powiedzmy, MD5, polega na tym, że trudniej jest sfałszować plik w celu dopasowania do "docelowego" MD5, niż modyfikować go tak, aby pasował do "docelowej" sumy kontrolnej. Ponieważ nie stanowi to problemu dla twojego programu, nie powinno mieć znaczenia, z której metody korzystasz. Być może MD5 może być nieco bardziej obciążający procesor, ale nie wiem, czy to się zmieni.

Głównym pytaniem powinna być liczba bajtów skrótu.

Jeśli robisz sumę kontrolną w liczbie całkowitej, oznacza to, że dla pliku o rozmiarze 2K pasujesz 2^2048 kombinacji do 2^32 kombinacji -> dla każdej wartości CRC będziesz mieć 2^64 możliwe pliki, które pasują do niego. Jeśli masz 128 bitowy MD5, masz 2^16 możliwych kolizji.

Im większy kod, który obliczasz, tym mniej możliwych kolizji (biorąc pod uwagę równomierne rozłożenie kodów), tym bezpieczniejsze jest porównanie.

W każdym razie, w celu minimice ewentualnych błędów, myślę, że najpierw powinna być klasyfikacja przy użyciu rozmiaru pliku ... najpierw porównać rozmiary plików, o ile odpowiadają one następnie porównać sumy kontrolne/hash.

-3

do porównania dwóch buforowanych obrazów można użyć BufferedImage.equals(), a dla uproszczenia można użyć BufferedImage.hashCode(), aby uzyskać skrót obrazu, który jest szybki i szybki.

+6

Zarówno 'equals()' jak i 'hashCode()' wracają do domyślnej implementacji 'Object' i nie mogą być użyte do porównania dwóch różnych instancji' BufferedImage's –

Powiązane problemy