Всем привет!
Существует задача поиска абсолютно одинаковых фотографий. Именно не похожих друг на друга, а 100% одинаковых.
Остановил свой выбор на самом простом решении: hash_file. Собственно сам вопрос звучит так - насколько вероятно повторение хэша для двух (и более) различных файлов? При использовании алгоритма md5?
Где-то слышал, что с md5 существует такой прикол. Что один и тот же хэш соответствует двум и более различным строкам. Есть термин даже специальный подобного явления, только не запомнил, увы...
В функции есть еще другие методы хэширования, однако мне нужен наиболее быстрый.
Invis1ble
18.10.2015 - 00:27
коллизия, вероятность стремится к нулю
и чем больше разрядность хэша, тем меньше эта вероятность
md5 для фотографий вполне достаточно, имхо
_____________
Профессиональная разработка на заказЯ на GitHub |
второй профиль
Спасибо!
А если я назову файлы (картинки) по хэшу, то есть в названии будет 32 символа. Это очень отвратительно или нормально? ))
inpost
18.10.2015 - 03:16
RonРано или поздно коллизия... эх, не стоит так делать.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Razzwan
18.10.2015 - 03:30
Цитата (inpost @ 18.10.2015 - 03:16) |
Рано или поздно коллизия... эх, не стоит так делать. |
Эй, ну это не ответ. А как стОит?
И, самое главное, почему не стОит? Из-за коллизий?
Тогда вопрос ТС - а сколько картинок всего?
Если подразумевается их бесконечное количество, то тогда согласен - коллизии возможны. Если же они ограниченны, то вряд ли.
_____________
Youtube канал WebDeveloper->Run()Сайт для душиGitter
Цитата (inpost @ 18.10.2015 - 03:16) |
Рано или поздно коллизия... |
Рано или поздно и солнце погаснет! =) Что ж теперь поделать. Просто я всегда считал, что md5 от файла служит немного для других целей. Отсюда и вопрос такой про коллизии.
Цитата (Razzwan @ 18.10.2015 - 03:30) |
Тогда вопрос ТС - а сколько картинок всего? |
По характеристикам проекта, количество картинок очень врядли когда-нибудь превысит 200-300к.
Razzwan
18.10.2015 - 03:41
Цитата (Ron @ 18.10.2015 - 03:36) |
По характеристикам проекта, количество картинок очень врядли когда-нибудь превысит 200-300к. |
Цитата |
На процессоре Core2 Q9550 коллизия нашлась за три недели. По оценке Марка Стивенса, расчётное время составляет около пяти недель. |
т.е. явно не твой случай. Потому как 200-300к хешей картинок можно перебрать за секунды.
_____________
Youtube канал WebDeveloper->Run()Сайт для душиGitter
Ну понял, короче париться нет повода. Всем спасибо! )
inpost
18.10.2015 - 05:02
RonА зачем рисковать? Почему бы просто не дать уникальное имя файлу и всё? Берём тысячу программистов прочитавших эту тему, у каждого из которых будет по миллиону записей - получили уже миллиард записей. Не у тебя, так у твоего сосед. Не у соседа, так у тебя через годик, рано или поздно произойдет беда.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Цитата (inpost @ 18.10.2015 - 05:02) |
А зачем рисковать? Почему бы просто не дать уникальное имя файлу и всё? |
Каким образом это сделать? Задача ведь не только в имени, но и в содержимом. То есть в исключении одинаковых файлов.
Так-то можно просто пустить таблицу отдельную и называть файлы по автоинкременту.
Других способов получить уникальные имена я вообще честно говоря и не знаю. Разве что генерировать, потом проверять на существование, затем снова генерировать в случае повтора. Но это по-моему неуклюже.
inpost
18.10.2015 - 18:29
RonТаблица: id, photo, hash. Вот и всё. Можно даже без id.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
inpost, насколько я понял, коллизии вероятны только на исключительно похожих друг на друга файлах/строках. Полагаю, если будут два изображения настолько похожих "внутри", то и выглядеть они будут практически идентично. За исключением может быть некоторых пикселов или вроде того. То есть ничего страшного для пользователя не случится, думаю даже разницы не заметит.
Цитата (inpost @ 18.10.2015 - 18:29) |
Таблица: id, photo, hash. Вот и всё. Можно даже без id. |
Результат для моей задачи будет точно таким же. Просто мы (зачем-то) заведем еще одну таблицу. ) Если хэш совпадет, совершенно неважно под каким именем на диске лежит фото. Оно так и так будет признано не уникальным. Мы можем обозвать файлы по хэшу и просто проверить на file_exists. Работа с ФС по точному пути идет существенно быстрее чем с СуБД.
Тем более поиск по полю varchar. Можно завести INT и делать преобразование, но тогда при обратном конвертировании пропадут нули слева. То есть в запросе придется городить условие еще к тому же и добивать hex до 32-х символов незначащими нулями слева.
Так что предложенный тобой вариант, боюсь, не только не решит задачу, но и усугубит ее. Тут ведь дело не в уникальном имени. А в уникальном содержимом.
Invis1ble
19.10.2015 - 02:37
Цитата (Ron @ 18.10.2015 - 21:44) |
Полагаю, если будут два изображения настолько похожих "внутри", то и выглядеть они будут практически идентично |
Это вряд ли. Скорее всего, файл с совпадающим хэшем вообще не будет являться корректной картинкой. И, вероятно, скорее Солнце погаснет, чем у человечества внезапно появятся 2 разные картинки с одинаковым хэшем, которые еще, к тому же, внезапно загрузят к тебе на сервер.
_____________
Профессиональная разработка на заказЯ на GitHub |
второй профиль
inpost
19.10.2015 - 12:53
Ron
Коллизия идет по совершенно разному содержанию.
Цитата |
Тем более поиск по полю varchar |
Чем не нравится? Ставишь индекс в 32 символа и у тебя летает он.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
killer8080
19.10.2015 - 13:16
Ron
вероятность коллизии в твоем случае ничтожно мала, но если страдать паранойей, то можно сделать составной хеш md5/sha1, вероятность перекрестной коллизии практически равна нулю.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.