2011-06-17 2 views
8

Я делаю код обработки изображений, где я загружаю некоторые изображения (как BufferedImage) из URL-адресов и передаю их на процессор изображений.Проверить, являются ли два файла изображений одинаковыми..Чегсум или Хэш?

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

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

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

Спасибо, Abi

+1

[Контрольная сумма и хэш-сумма одинаковы] (http://en.wikipedia.org/wiki/Checksum). На самом деле вы просто смотрите на разные алгоритмы. –

+1

128-битный MD5-хэш должен быть достаточным для вашей цели. – Thor

+5

BTW - MD5 должен создать 128-битное хэш-значение, в то время как crc32 имеет 32 бита ... Что вы сделали для генерации шестнадцатеричных контрольных сумм длиной 20 кбайт? –

ответ

1

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

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

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

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

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

+0

Возможно, может возникнуть проблема с хранением уже обработанных файлов, чтобы сравнить их с новыми Контрольная сумма или хеш занимает меньше места. – SJuan76

+0

Это правда. Я никогда не собирался хранить весь файл в базе данных для сравнения. Просто говоря, что для одного прогона вам вообще не нужно будет вычислять хэш. хранить данные для проверки вновь добавленных файлов, тогда имеет смысл хранить хэш или вы можете выбрать только размер файла и вычислить (и сохранить) хэш только в том случае, если два файла siz . Это сэкономит место и сохранит диск IO. – GolezTrol

5

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

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

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

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

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

-3

Для сравнения двух буферизованных изображений вы можете использовать BufferedImage.equals(), и для простоты вы можете использовать BufferedImage.hashCode(), чтобы получить хэш изображения, это быстро и быстро.

+6

Оба символа 'equals()' и 'hashCode()' возвращаются к реализации 'Object' по умолчанию и не могут использоваться для сравнения двух разных экземпляров' BufferedImage' –

Смежные вопросы