Проверка файла на уникальность

4.11K
.
Срочно ищу чертёж машины времени ⏳

Хочу сделать чтобы при выгрузке файла в Джоне, шла проверка по размеру или содержимому. (Или хотя бы выводился список похожих Загрузок ориентируясь по названию). Чтобы пользователи не плодили копии одних и тех же файлов.
Подскажите куски кода, которыми можно это сделать на РНР7.
И было бы полезно услышать комментарии как оптимизировать это дело (если надо/возможно)?

.
Hey guys! Finally I'm gonna change status!?

Chifty, Тынц md5-file
Ну и при загрузке хеш записывать в таблицу с файлами, если хеши совпадают, второй файл не сохранять, а просто ссылку на уже существующий сделать.

.
Срочно ищу чертёж машины времени ⏳

Неплохо было бы разжиться куском кода, который выводит уведомление с ссылкой, на существующий файл.
А также куском кода, который бы искал загрузки с похожим названием (например по совпадению 5ти знаков подряд в имени)

.
Hey guys! Finally I'm gonna change status!?

Chifty, Ну так ты покажи на чем остановился, а то вариаций может быть столько, сколько сайтов в интернете

.
Срочно ищу чертёж машины времени ⏳
Добавлено: 08.09.2018 / 08:02
Остановился ещё на стадии планирования куда лучше писать хэш - в дополнительное поле к загрузке или в отдельную таблицу. Чтобы оптимальнее по нагрузке.
И как потом сгенерировать хэш для уже имеющихся файлов?
А насчёт поиска по имени я что-то не разобрался как искать совпадение нескольких символов подряд, если обе строки разные по длине и совпадение может быть в разных концах строк. (такой поиск вообще возможен?)

Добавлено: 08.09.2018 / 10:49
Короче придумал я как примерно оно будет.
Будет отдельная таблица: ИД загрузки / РЕФИД дополнительного файла (если есть) / ИМЯ загрузки или дополнительного файла / РАЗМЕР в байтах / ХЕШ
По алгоритму: При выгрузке файла сравнивается размер в байтах, если совпадений меньше 3, выводим предупреждение с списком совпадений и кнопкой "Продолжить". Если больше 3 - сравниваем хэш-суму с совпадающими строками из списка, если есть совпадение - выводим предупреждение с ссылкой на дубль икнопкой "отменить", если нетсовпадений - выполнять скрипт заливки дальше.

Приветствуется разумная критика
Может вообще хэш добавить сразу в таблицу с загрузками? (Хотя туту меня несколько вопросов:
В download__files нет поля size, в downloads__more - есть. Хотя из первой таблицы размер файла откуда-то берётся.
Не слишком ли напряжно будет MySQL соединять две полных таблицы (обьем получится большой. например если 100к файлов. и еще 300к дополнительных файлов)
Какие поля в новой таблице надо будет индексировать? я с оптимизацией на ВЫ
Может я много лишнего предлагаю в своем алгоритме? Просто бывает например 2 версии файла, полностью одинаковых по размеру, но с разным MD5. А по сути, это один и тот же файл... Или такого не может быть?
.
Hey guys! Finally I'm gonna change status!?

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

example (+/-)
if (!empty($_FILES['file'])) {
            $upload = Core\Upload::factory('loads', __dir__ . '/../');
            $upload->file($_FILES['file']);
            $validation = new validation;
            // check name leigth and mime type
            $upload->callbacks($validation, array('check_name_length','check_mime_type'));
            // set max. file size (in mb)
            $upload->set_max_file_size(2);
            $fileformat = strrchr($_FILES['file']['name'], '.');
            if (isset($_POST['auto']) || preg_match('/[а-яё]+/i', $_FILES['file']['name'])) {
                $filesme = uniqid('image_') . $fileformat;
            } else {
                $filesme = $_FILES['file']['name'];
            }
			$hash_file = md5_file($_FILES['file']['tmp_name']);
			if (!$file_name = $db->query('SELECT `file` FROM `pic_files` WHERE `hash_file`=?', [$hash_file])->el()) {
				$results = $upload->upload($filesme);
			} else {
				$filesme = $file_name;
				$results['status'] = true;
				$err = 'Такой файл уже загружен, ваш файл переименован!';
			}
        }
        if ($results['status']) {
            $id_cat = intval($_POST['cat']);
            $file_id = $db->query(
            'INSERT INTO `pic_files` (`id_cat`, `file`, `hash_file`, `time_d`, `time_s`, `time`, `id_user`) VALUES(?i, ?, ?, ?i, ?i, ?i, ?i)',
                            [$id_cat, $filesme, $hash_file, time(), time(), time(), $user['id']])->id();
            echo '<div class="msg">Файл успешно добавлен</div>';
        } else {
            $err = $results['errors'];
        }

Хеш существующих файлов можно записать в таблицу как то так
select `name` /* или ай-ди в зависимости как у тебя файлы на диске названы */ from tbl
while () {
// тут пройти по файлам с $hash = md5_file('path_to_file');
update tbl set hash=$hash where id;
}
.
(\/)____o_O____(\/)

kantry, Ты этот говнокласс используешь для мускула?
Мд5 будет достаточно. Можно ещё и файлы положить по папкам с хэш

https://github.com/Compolomus/ ... orage

.
Hey guys! Finally I'm gonna change status!?
# Koenig (09.09.2018 / 12:03)
kantry, Ты этот говнокласс используешь для мускула?
goDB что ли, с чего бы он говном то стал?
.
Кадило крутится, лавэха мутится

Просто md5 не рекомендовал бы использовать. Сталкивался с пересечениями даже при количестве файлов в 4к штук.
Комбо вариант используйте. храните 2 хэша md5_file и sha1_file. Так вероятность пересечения будет меньше.

.
Срочно ищу чертёж машины времени ⏳

ну так накидайте набросок кода для 7го джона, пожалуйста

Всего: 59