Как работает сравнение изображений через md5? - PullRequest
3 голосов
/ 31 января 2011

Этот метод сравнивает пиксельные значения изображений? Я предполагаю, что это не будет работать, потому что они отличаются друг от друга по размеру, но что, если они идентичны, но в разных форматах? Например, я сделал снимок экрана и сохранил как .jpg, а другой - как .gif.

Ответы [ 8 ]

13 голосов
/ 31 января 2011

MD5-хэш содержит действительные двоичные данные, поэтому разные форматы будут иметь совершенно разные двоичные данные.

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

Это на самом деле один из способов, которым судебно-медицинская полиция находит данные, которые она считает контрабандой. (со ссылкой на изображения)

8 голосов
/ 31 января 2011

Это контрольная сумма MD5 - то же самое, что вы часто видите при загрузке файла, если MD5 загруженного файла совпадает с MD5, предоставленным провайдером, то передача файла прошла успешно.http://en.wikipedia.org/wiki/Checksum Если разница между этими двумя файлами равна 1 биту, то результирующий хеш будет совершенно другим.

Из-за разницы в кодировке между JPG и GIF 2 не будет иметьтот же хеш MD5.

2 голосов
/ 31 января 2011

Файл .jpg начинается с 'JFIF', файл .gif начинается с 'GIF', когда вы смотрите необработанные байты.Другими словами, сравнение на диске байтов «одного и того же изображения» в двух разных форматах в значительной степени гарантирует получение двух разных хеш-кодов MD5, поскольку содержимое файла различается - даже если фактическим изображением является «одно и то же изображение».

Чтобы выполнить сравнение изображений на основе хеш-функции, необходимо сравнить два изображения в одном и том же формате.Было бы очень очень трудно создать .jpg и .gif одного изображения, которые сравнивались бы равными, если бы вы конвертировали их в (скажем) .bmp.Это был бы тот же формат файла, но внутренние требования .gif (8-бит, сжатие без потерь RLE / LZW) по сравнению с внутренними требованиями .jpg (24-бит, сжатие с дискретным косинусным преобразованием с потерями) означают, что почти невозможно получить то же самое.bmp из обоих исходных изображений.

2 голосов
/ 31 января 2011

Вы не можете сравнивать, используя сумму MD5, как отмечали все остальные авторы.Тем не менее, вы можете сравнить изображения по-разному, и это скажет вам их сходство независимо от типа изображения или даже размера.Вы можете использовать libPuzzle

http://libpuzzle.pureftpd.org/project/libpuzzle

Это отличная библиотека для сравнения изображений и работает очень хорошо.

1 голос
/ 31 января 2011

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

Таким образом, вы не сравниваете изображения при подаче изображения в md5, а необработанные данные изображения. Алгоритм хеширования ничего не знает об этом, кроме необработанных данных, поэтому jpg и gif (или любой другой формат изображения) одного и того же снимка экрана никогда не будут одинаковыми.

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

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

1 голос
/ 31 января 2011

Если вы сравниваете хэши, то каждый байт двух изображений должен совпадать - они не могут использовать разные форматы сжатия или «выглядят одинаково».Они должны быть идентичны.

0 голосов
/ 31 января 2011

Это все равно не будет работать. Любое изображение содержит часть заголовка и буфер двоичного изображения. В указанном сценарии 1. Заголовки будут разными в .jpg и .gif, что приведет к разной сумме md5 2. Сам буфер изображения может отличаться из-за сжатия изображения, используемого, скажем, в формате .jpg.

0 голосов
/ 31 января 2011

md5 - это хеш. Это код, который рассчитывается на основе набора данных - любых данных на самом деле.

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

...