1 Востаннє редагувалося VTrim (24.09.2014 07:58:44)

Тема: Порівняти зображення

Задача на PHP.
Вона досить проста.

Користувачі вашого сайту постійно завантажують різні картинки з одного і того ж сайту (не редагуючи їх) в каталог /images/ .
Вам потрібно уникнути завантаження ідентичних зображень,які вже є на сервері,враховуючи,що сама назва зображення може може бути змінена,та видати шлях до цього зображення (якщо таке вже є).
Наприклад: /images/truemyphoto.jpg вже існує.
НЕ використовувати sha1_file() и md5_file() hash() hash_file() hash_hmac_file() hash_update_file()
Та не використовувати бібліотеки,типу GD та інші.
Реалізувати у вигляді функції.

2

Re: Порівняти зображення

А де тут логіка? Тримати хеші в БД, от і вся логіка.

3 Востаннє редагувалося VTrim (23.09.2014 21:42:42)

Re: Порівняти зображення

quez написав:

А де тут логіка? Тримати хеші в БД, от і вся логіка.

Мене не цікавлять такі коментарі,а цікавить код,точніше різні варіації виконання цього завдання
upd: обновив 1 пост

4

Re: Порівняти зображення

VTrim написав:

НЕ використовувати sha1_file() и md5_file()

Використовуйте hash_file, або нормально запишіть умову.

5

Re: Порівняти зображення

koala написав:
VTrim написав:

НЕ використовувати sha1_file() и md5_file()

Використовуйте hash_file, або нормально запишіть умову.

Ну вона також використовує md5 sha1 або інше хешування,відредагував.

6

Re: Порівняти зображення

Напишіть власну функцію хешування - наприклад, просто XOR блоків по 16 байт.

7

Re: Порівняти зображення

koala написав:

Напишіть власну функцію хешування - наприклад, просто XOR блоків по 16 байт.

Та я вже вирішив це завдання,просто написав його тут,глянути як його напишуть інші.

8

Re: Порівняти зображення

Розумієте, пане, воно нікому, окрім вас, не треба. Якби ви навели код і спитали, що там можна покращити - тоді було б про що говорити, а так...

9

Re: Порівняти зображення

Щоб порівняти картинки без використання хешів - їх треба спочатку завантажити хоча б в оперативку.
В такому випадку задача по уникненню зайвого завантаження вже провалена.
І хто куди завантажує картинки? Користувачі собі на комп чи вказують вашому сайту стягнути в свій каталог картинку з іншого сайту?

10 Востаннє редагувалося VTrim (24.09.2014 08:31:22)

Re: Порівняти зображення

koala написав:

Розумієте, пане, воно нікому, окрім вас, не треба. Якби ви навели код і спитали, що там можна покращити - тоді було б про що говорити, а так...

Поки що я не прошу допомоги (як тільки,так відразу..). Я бачив тут викладали різні задачі і Ви в тому числі. Кому цікаво,той спробує вирішити,а кому ні - має пройти мимо,наприклад Ви.

11

Re: Порівняти зображення

yarko написав:

Щоб порівняти картинки без використання хешів - їх треба спочатку завантажити хоча б в оперативку.
В такому випадку задача по уникненню зайвого завантаження вже провалена.
І хто куди завантажує картинки? Користувачі собі на комп чи вказують вашому сайту стягнути в свій каталог картинку з іншого сайту?

Завантаження через upload форму в браузері. (інший сайт згадується просто так). Ну так,файл має завантажитись в оперативку,після чого і здійснити перевірку.

12 Востаннє редагувалося yarko (24.09.2014 08:42:39)

Re: Порівняти зображення

1. Завантажити тестовану картинку в оперативку клієнта.
2. Завантажити з сервера перші 16 байтів кожної вже наявної картинки тако самого фізичного розміру. Порівняти перші 16 байтів тестованої картинки з стягнутими блоками. Нема співпадінь - картинка нова.
3. Є співпадіння - завантажити наступні 16 байтів з картинок, початкові байти яких співпали. Порівняти. Нема співпадінь - картинка нова. Інакше повторювати п.3.

PHP не знаю, тому подав алгоритм
16 вказано як приклад

я правильно зрозумів, що обмежень по завантаженю з сервера немає?

13

Re: Порівняти зображення

Це той самий хеш, тільки функція багована.

14

Re: Порівняти зображення

таке

<?php
function issetImage($dir)
{
define('ROOT',$_SERVER['DOCUMENT_ROOT']);
define('HOST',$_SERVER['HTTP_HOST']);

if(isset($_GET['upload']))
{
if(is_uploaded_file($_FILES['filename']['tmp_name']))
{
$pict = array('.gif', '.jpg', '.jpeg', '.png', '.bmp');
$ext = strtolower(strrchr($_FILES['filename']['name'], '.'));

if(!in_array($ext, $pict))
{
exit('Невірний формат');
}
$catalog = ROOT.$dir;
$files = array_slice(scandir($catalog),2);
foreach($files as $file)
{
if(file_get_contents(ROOT.'/'.$dir.'/'.$file) == file_get_contents($_FILES['filename']['tmp_name']))
{
exit('Картинка <img src="http://'.HOST.'/'.$dir.'/'.$file.'"> <br/> <a href="http://'.HOST.'/'.$dir.'/'.$file.'">http://'.HOST.'/'.$dir.'/'.$file.'</a> вже існує');
}
}
copy($_FILES['filename']['tmp_name'], $catalog.'/'.mt_rand(1,9999).''.$_FILES['filename']['name']);
echo 'Файл завантажено.';
}
else 
{
echo 'Помилка завантаження файлу';
}
}
}
echo issetImage('/images');
?>
<html>
<head>
  <title>Завантаження картинки</title>
</head>
<body>
      <h2><p><b> Форма для завантаження картинки </b></p></h2>
      <form action="?upload" method="post" enctype="multipart/form-data">
      <input type="file" name="filename"> 
      <input type="submit" value="Завантажити"><br>
      </form>
</body>
</html>

15 Востаннє редагувалося yarko (24.09.2014 12:34:56)

Re: Порівняти зображення

м... Тобто перед відвантаженням картинки клієнт завантажує всі картинки з сервера і порівнює в оперативці клієнта?
Не ефективніше відвантажити картинку на сервер і порівнювати її вже там?

16

Re: Порівняти зображення

if(file_get_contents(ROOT.'/'.$dir.'/'.$file) == file_get_contents($_FILES['filename']['tmp_name']))

НЕ використовувати sha1_file() и md5_file() hash() hash_file() hash_hmac_file() hash_update_file()

Ги ги, оптимізація так і пре

Подякували: quez, mike, koala3

17

Re: Порівняти зображення

Знаєте, дуже хотілося б подивитись на швидкість виконання, особливо коли на сервері вже є сотня схожих зображень по кілька мегабайтів.

Подякували: koala1

18

Re: Порівняти зображення

yarko написав:

м... тобто перед відвантаженням картинки клієнт завантажує всі картинки з сервера і порівнює в оперативці клієнта?

Ні,клієнт завантажує зображення,воно зберігається на сервері в папці для тимчасових файлів,після чого перевіряю вміст цього файлу зі вмістом файлів папки,куди хочу завантажити (/images) і якщо в вміст клієнтського файлу і одного з тих,що є на сервері - ідентичні,то зупиняю скрипт і видаю лінк на цей файл.

19

Re: Порівняти зображення

0xDADA11C7 написав:
if(file_get_contents(ROOT.'/'.$dir.'/'.$file) == file_get_contents($_FILES['filename']['tmp_name']))

НЕ використовувати sha1_file() и md5_file() hash() hash_file() hash_hmac_file() hash_update_file()

Ги ги, оптимізація так і пре

Ну з умови і було неявно сказано,шо потрібно створити велосипед).

20

Re: Порівняти зображення

при великій кількості підключень, буде суттєве навантаження на диск, цей код хоч і робочий, але... imho.