Чтобы проверить, совпадают ли два файла изображения .. Контрольная сумма или Хэш? - PullRequest
8 голосов
/ 17 июня 2011

Я делаю некоторый код обработки изображений, где я загружаю некоторые изображения (как BufferedImage) с URL-адресов и передаю их в процессор изображений.

Я хочу избежать передачи одного и того же изображения более одного раза в процессор изображений (так как операция обработки изображения требует больших затрат). Конечные точки URL изображений (если они одинаковые) могут отличаться, и поэтому я могу предотвратить это с помощью URL. Поэтому я планировал сделать контрольную сумму или хэш, чтобы определить, встречается ли код снова с тем же изображением.

Для md5 я попытался Быстрый MD5 , и он сгенерировал для изображения значение шестнадцатеричной контрольной суммы длиной 20К + символов (пример). Очевидно, что сохранение этого хеша размером 20 КБ будет проблемой, когда речь заходит о хранении базы данных. Поэтому я попробовал CRC32 (из java.util.zip.CRC32). И он сгенерировал гораздо меньшую контрольную сумму длины, чем хеш.

Я понимаю, контрольная сумма и хэш предназначены для разных целей. Для целей, описанных выше, я могу просто использовать CRC32? Это решит цель, или мне придется попробовать что-то большее, чем эти два?

Спасибо, Abi

Ответы [ 2 ]

5 голосов
/ 17 июня 2011

Разница между CRC и, скажем, MD5 заключается в том, что подделать файл для соответствия «целевому» MD5 труднее, чем подделать его для соответствия «целевой» контрольной сумме.Поскольку это не кажется проблемой для вашей программы, не имеет значения, какой метод вы используете.Возможно, MD5 может быть немного более загруженным процессором, но я не знаю, будет ли это иметь значение.

Главный вопрос должен быть о количестве байтов дайджеста.

Если вы делаетеконтрольная сумма в целом числе будет означать, что для файла размером 2K вы подходите 2 ^ 2048 комбинаций к 2 ^ 32 комбинациям -> для каждого значения CRC у вас будет 2 ^ 64 возможных файлов, которые соответствуют ему.Если у вас 128-битный MD5, то у вас 2 ^ 16 возможных коллизий.

Чем больше код, который вы вычисляете, тем меньше коллизий (учитывая, что вычисленные коды распределяются равномерно), тем безопаснееcomparation.

В любом случае, чтобы минимизировать возможные ошибки, я думаю, что первая классификация должна использовать размер файла ... сначала сравните размеры файла, если они совпадают, затем сравните контрольные суммы / хэш.

1 голос
/ 17 июня 2011

Контрольная сумма и хэш в основном совпадают. Вы должны быть в состоянии вычислить любой вид хэша. Обычного MD5 обычно достаточно. Если хотите, вы можете сохранить размер и хэш md5 (я думаю, что это 16 байт).

Если два файла имеют разные размеры, это разные файлы. Вам даже не нужно будет вычислять хеш по данным. Если маловероятно, что у вас много дублирующихся файлов, а файлы имеют больший размер (например, изображения JPG, сделанные с помощью камеры), эта оптимизация может сэкономить вам много времени.

Если два или более файлов имеют одинаковый размер, вы можете рассчитать хеш-коды и сравнить их.

Если два хэша одинаковы, вы можете сравнить фактические данные, чтобы увидеть, все ли они отличаются. Это очень, очень маловероятно, но теоретически возможно. Чем больше ваш хеш (md5 составляет 16 байт, а CR32 - только 4), тем меньше вероятность того, что два разных файла будут иметь одинаковый хеш. Для выполнения этой дополнительной проверки потребуется всего 10 минут программирования, поэтому я бы сказал: лучше, чем потом сожалеть. :)

Для дальнейшей оптимизации, если ровно два файла имеют одинаковый размер, вы можете просто сравнить их данные. Вам все равно нужно будет прочитать файлы, чтобы вычислить их хэши, так почему бы не сравнить их напрямую, если они единственные с таким конкретным размером.

...