@JohnDidact
Нуб во всём

Как лучше сравнить два файла изображения?

Цель: получаю удаленное изображение, сохраняю локально. Потом это изображение ежеминутно сравниваю с удаленным. Если они разные, то далее делаю определенные действия.
Нужно сравнивать не то, что изображено на картинке, а всё: формат, размеры, качество и т.д. Проще говоря, сам файл. Нужно сделать это всё максимально быстро и с минимальными затратами. Изображения, в среднем, размером 50x50. Сейчас сравниваю обычным file-get-contents() оператором сравнения. Напрягает лично меня то, что нужно открывать http протокол (когда получаю содержимое удалённого файла), ну и само сравнение не малого текста. Думал сравнивать хэши, но ведь чтобы получить хэш, нужно всё равно открыть http, прочитать каждый символ. Потом ещё и захэшировать... Ещё больше затрат. Или я может чего-то неправильно понимаю? В общем, что посоветуете?
  • Вопрос задан
  • 67 просмотров
Решения вопроса 1
@Mellorn

Напрягает лично меня то, что нужно открывать http протокол (когда получаю содержимое удалённого файла)

А почему это вас напрягает?
Вам же нужно сравнивать локальный файл с удалённым. А как можно провести такое сравнение, предварительно не получив удалённый файл?
Это нормально.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@alexalexes
Фишка хэширования в том, что вы считаете его ровно один раз, и при повторном сравнении уже оперируете им, а не содержимым файла.
У вас есть 1 млн. файлов. При получении каждого файла вы подготовили для него хэш и сохранили этот хэш в отдельном массиве в оперативной памяти, в файле на диске или в таблице базы данных.
Когда поступит следующий файл, то вы от него тоже получите хэш, но при сравнении вам уже не надо вычитывать 1 млн. файлов, чтобы сделать сравнение, достаточно обратиться к более быстрому источнику за хэшами этих файлов, сравнение которых будет короче и перебор быстрее (если эта база данных, то должны использоваться индексы, если оперативная память, то сбалансированные деревья и бинарный поиск и т.п.).
Ответ написан
@rPman
В http стандарте есть заголовки, отвечающие за размер и время изменения файла
посмотрите на ваш файл в своей программе или с помощью утилит curl -I http://.... сам файл при этом не загружается.

Такие заголовки как Content-Length или Date или ETag, не всегда они есть но если они есть и изменились - значит файл изменился, иначе загружать весь не обязательно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы