[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: hash_file
Ron
Всем привет!

Существует задача поиска абсолютно одинаковых фотографий. Именно не похожих друг на друга, а 100% одинаковых.

Остановил свой выбор на самом простом решении: hash_file. Собственно сам вопрос звучит так - насколько вероятно повторение хэша для двух (и более) различных файлов? При использовании алгоритма md5?

Где-то слышал, что с md5 существует такой прикол. Что один и тот же хэш соответствует двум и более различным строкам. Есть термин даже специальный подобного явления, только не запомнил, увы...

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

Invis1ble
коллизия, вероятность стремится к нулю
и чем больше разрядность хэша, тем меньше эта вероятность
md5 для фотографий вполне достаточно, имхо

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Ron
Спасибо!

А если я назову файлы (картинки) по хэшу, то есть в названии будет 32 символа. Это очень отвратительно или нормально? ))

inpost
Ron
Рано или поздно коллизия... эх, не стоит так делать. wink.gif

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Razzwan
Цитата (inpost @ 18.10.2015 - 03:16)
Рано или поздно коллизия... эх, не стоит так делать. 

Эй, ну это не ответ. А как стОит?
И, самое главное, почему не стОит? Из-за коллизий?

Тогда вопрос ТС - а сколько картинок всего?

Если подразумевается их бесконечное количество, то тогда согласен - коллизии возможны. Если же они ограниченны, то вряд ли.

_____________
Youtube канал WebDeveloper->Run()
Сайт для души
Gitter
Ron
Цитата (inpost @ 18.10.2015 - 03:16)
Рано или поздно коллизия...

Рано или поздно и солнце погаснет! =) Что ж теперь поделать. Просто я всегда считал, что md5 от файла служит немного для других целей. Отсюда и вопрос такой про коллизии.

Цитата (Razzwan @ 18.10.2015 - 03:30)
Тогда вопрос ТС - а сколько картинок всего?

По характеристикам проекта, количество картинок очень врядли когда-нибудь превысит 200-300к.


Razzwan
Цитата (Ron @ 18.10.2015 - 03:36)
По характеристикам проекта, количество картинок очень врядли когда-нибудь превысит 200-300к.


Вырезка из статьи на хабре:
Цитата
На процессоре Core2 Q9550 коллизия нашлась за три недели. По оценке Марка Стивенса, расчётное время составляет около пяти недель.


т.е. явно не твой случай. Потому как 200-300к хешей картинок можно перебрать за секунды.

_____________
Youtube канал WebDeveloper->Run()
Сайт для души
Gitter
Ron
Ну понял, короче париться нет повода. Всем спасибо! )


inpost
Ron
А зачем рисковать? Почему бы просто не дать уникальное имя файлу и всё? Берём тысячу программистов прочитавших эту тему, у каждого из которых будет по миллиону записей - получили уже миллиард записей. Не у тебя, так у твоего сосед. Не у соседа, так у тебя через годик, рано или поздно произойдет беда.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Ron
Цитата (inpost @ 18.10.2015 - 05:02)
А зачем рисковать? Почему бы просто не дать уникальное имя файлу и всё?

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

Так-то можно просто пустить таблицу отдельную и называть файлы по автоинкременту.

Других способов получить уникальные имена я вообще честно говоря и не знаю. Разве что генерировать, потом проверять на существование, затем снова генерировать в случае повтора. Но это по-моему неуклюже.







inpost
Ron
Таблица: id, photo, hash. Вот и всё. Можно даже без id.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Ron
inpost, насколько я понял, коллизии вероятны только на исключительно похожих друг на друга файлах/строках. Полагаю, если будут два изображения настолько похожих "внутри", то и выглядеть они будут практически идентично. За исключением может быть некоторых пикселов или вроде того. То есть ничего страшного для пользователя не случится, думаю даже разницы не заметит.

Цитата (inpost @ 18.10.2015 - 18:29)
Таблица: id, photo, hash. Вот и всё. Можно даже без id.

Результат для моей задачи будет точно таким же. Просто мы (зачем-то) заведем еще одну таблицу. ) Если хэш совпадет, совершенно неважно под каким именем на диске лежит фото. Оно так и так будет признано не уникальным. Мы можем обозвать файлы по хэшу и просто проверить на file_exists. Работа с ФС по точному пути идет существенно быстрее чем с СуБД.

Тем более поиск по полю varchar. Можно завести INT и делать преобразование, но тогда при обратном конвертировании пропадут нули слева. То есть в запросе придется городить условие еще к тому же и добивать hex до 32-х символов незначащими нулями слева.

Так что предложенный тобой вариант, боюсь, не только не решит задачу, но и усугубит ее. Тут ведь дело не в уникальном имени. А в уникальном содержимом.

Invis1ble
Цитата (Ron @ 18.10.2015 - 21:44)
Полагаю, если будут два изображения настолько похожих "внутри", то и выглядеть они будут практически идентично

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

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

inpost
Ron
Коллизия идет по совершенно разному содержанию.

Цитата
Тем более поиск по полю varchar

Чем не нравится? Ставишь индекс в 32 символа и у тебя летает он.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
killer8080
Ron
вероятность коллизии в твоем случае ничтожно мала, но если страдать паранойей, то можно сделать составной хеш md5/sha1, вероятность перекрестной коллизии практически равна нулю.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.