Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как проверить уникальность BLOB-файла? (https://javascript.ru/forum/misc/72917-kak-proverit-unikalnost-blob-fajjla.html)

Teamur 06.03.2018 15:38

Как проверить уникальность BLOB-файла?
 
BLOB'ы будем делать из картинок.

<!doctype html><meta charset='utf-8'><title>BLOB</title>
<div id='BOX'></div>
<input id='FI' type='file' multiple>

<style>
	#BOX{display:flex;flex-wrap:wrap}
	img{width:300px;padding:10px}
</style>

<script>
	let IMAGES = new Set;

	function Store(b, img=new Image){ console.log(b);
	  if(IMAGES.has(b)){ return };
	  img.src = URL.createObjectURL(b);
	  BOX.append(img);
	  IMAGES.add(b);
	  console.log(IMAGES)
	};

	FI.onchange=e=>{
	  let i, n=e.target.files, r;
	  for(i of n){
	    r=new FileReader;
	    r.readAsDataURL(i);
	    r.onload=e=>fetch(e.target.result)
	    .then(i=>i.blob())
	    .then(i=>Store(i))
	  }
	}
</script>


Добавьте 2 раза одинаковую картинку, чтобы понять в чем проблема.
Как запретить добавление одинаковых картинок в данном случае?

P.S.: Почему-то Set не помогает (

laimas 06.03.2018 16:02

Сравнивать хеш. Облегченный хеш - https://habrahabr.ru/post/120562/

Стоит добавить, что в 2014 эксперт Нэт Макхью сообщил о создании двух разных изображений имеющих одинаковый MD5 хеш. Вряд ли кто-то будет испытывать вас такой коллизией, но об этом нужно знать.

Teamur 06.03.2018 16:40

laimas,
спасибо, почитаю.
Нэт Макхью - не знаю кто это, но с тех пор прошло 4 года.
)

laimas 06.03.2018 16:53

Цитата:

Сообщение от Teamur
но с тех пор прошло 4 года

И что? :) На hash коллизиях строится один из способов DDOS атак и от них никто не отказался. А слабость криптостойкости хеш-функций применяемых в ЯП генерирует новые идеи "как можно нагадить".

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

Teamur 06.03.2018 17:14

laimas,
Цель:
Мне нужно загружать файлы с компьютера и сохранять их в IndexedDB, чтобы не было повторений.

laimas 06.03.2018 17:21

Ну тогда и проблем нет. И может проверки на имя хватит? И зачем же забивать базу такими данными?

Teamur 06.03.2018 17:27

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

Дома я буду создавать статьи, книжки и тп и, чтобы информация не потерялась, она будет храниться в БД браузера.

Затем когда результат меня устроит, я отправлю статью на сервер.
Серверная часть на NodeJS!

laimas 06.03.2018 17:40

Базы могут хранить BLOB, но забивать ими базу, а не хранить изображения в каталогах, это больше минусов, чем плюсов. Можно ведь в базе хранить только ссылку на изображение, а ее проверить можно.

Teamur 06.03.2018 17:53

laimas, ))
Но каталоги могут гулять, картинки тоже перемещаться и тп.
По поводу перцептивного хэша - я думаю у меня сто лет уйдет на написание функции.

Я то думал, что проверить уникальность не сложно.
Блин, буду искать pHash на Javascript. И как назло это будет 100 кб скрипт.

Teamur 06.03.2018 17:55

А Дискретное Косинусное Преобразование вообще 'убило' )

laimas 06.03.2018 17:55

https://github.com/blueimp/JavaScript-MD5

laimas 06.03.2018 17:57

Цитата:

Сообщение от Teamur
Но каталоги могут гулять, картинки тоже перемещаться и тп.

Храните их на диске в одном месте, удаляя при загрузке на сервер. На сервере надеюсь нет соблазна хранить их в базе?

Teamur 06.03.2018 18:07

laimas,
на сервере они будут лежать в спецпапке.

Вот такой, наверное, смешной вопрос еще:
А можно ли во время загрузки картинки просто получить, скажем, первые 100 байт этого файла, а затем если снова загружается такая же картинка - просто проверяем байты и, если они совпадает с сохраненной в Set'e последовательностью выводим сообщение о том что такой файл есть!

laimas 06.03.2018 18:18

Цитата:

Сообщение от Teamur
на сервере они будут лежать в спецпапке.

Даже в спец, а не просто в папке... )
И на клиенте тоже самое. Да и вообще, уж коли это для себя, то может ну его на... браузер и работать без ограничений? Ну или максимально убрать ограничения и использовать то, что "смертным" запрещено.

Цитата:

Сообщение от Teamur
А можно ли во время загрузки картинки просто получить, скажем, первые 100 байт этого файла, а затем если снова загружается такая же картинка - просто проверяем байты и, если они совпадает с сохраненной в Set'e последовательностью выводим сообщение о том что такой файл есть!

А почему вы думаете, что первые 100 байт обязательно уникальными будут? В первых байтах находится заголовок файла: тип, смещение адреса данных, размер данных, разрешение файла, глубина цвета... И эти данные могут быть одинаковы для разных файлов.

Teamur 06.03.2018 18:24

laimas,
тогда последние 100 байт или из середины!
То есть брать оттуда где точно нет информации о заголовках, разрешении, глубине и тп

И почему если блоб вставить в img.src он будет разным, хотя изображения одинаковые?

laimas 06.03.2018 18:28

Цитата:

Сообщение от Teamur
тогда последние 100 байт или из середины!

Уверены? Ссылка на хеш-функцию MD5 для JS вам дана, используйте. А из середины, с конца, это гадание на кофейной гуще, и гарантии нет, что повезет.

Цитата:

Сообщение от Teamur
И почему если блоб вставить в img.src он будет разным, хотя изображения одинаковые?

Не понял.

Teamur 06.03.2018 18:29

Не могу поверить, что простая проверка одинаковости файлов, выливается в такие проблемы!

Загружаем картинку с одним именем, затем такую же, но с другим именем и ВСЁ нужно сравнивать Хэши и тп. Невероятно! У файлов только имя поменялось, а тут такая история ))) Мда...

А в моём случае даже имя не менялось. Что за тупизм! Разочарован )

laimas 06.03.2018 18:33

Цитата:

Сообщение от Teamur
Загружаем картинку с одним именем, затем такую же, но с другим именем и ВСЁ нужно сравнивать Хэши и тп. Невероятно!

Вы имеете мои отпечатки пальцев и знаете меня под кличкой Косой. То есть если я назовусь этой кличкой, то вы проверите мои отпечатки и я буду пойман. Но если я сменю кличку на Садовник, то могу теперь ничего не опасаться?

Правда абсурд?

Teamur 06.03.2018 18:44

Попали в отделение (загрузили файл), сняли с вас пальчики, пробили по базе - о!
- Вы никакой не садовник, вы - косой!
Всё просто! ))

laimas 06.03.2018 18:48

То есть в любом случае нужно потрудится, проверить, а не брать на веру. А разве с файлами нужно поступать иначе?

Teamur 06.03.2018 19:11

laimas,
нап. возьмем картинку 10х10 пикселей.
если методом fetch прочитать файл как текст, то крякозябры у этого файла будут одни, а другого -другие.
Загружаем снова этот файл - такие же крякозябры -> alert('тот же файл!')
В данном примере легко все обходится без MD5, суперхэшей и тп.

laimas 06.03.2018 19:36

Цитата:

Сообщение от Teamur
нап. возьмем картинку 10х10 пикселей.

А если больше картинки?
В базе хранят уникальный оттиск, по которому и производят сравнение. Одним из способов получения такого оттиска является хеш изображения.

Я вас не уговариваю, делайте что хотите, 10х10 ли картинки, больше ли. Сам подход ваш не очень удачен - BLOB в базе, которая ограничена размером 5 МБ, это большая роскошь и дай бог, чтобы хватило. Нужен надежный механизм гарантирующий отсутствие дубликатов, но при этом то-ли себя, то-ли кого пытаетесь убедить не делать этого.

Я сказал все, что можно было сказать по этому вопросу, а вы поступайте так как хотите.

Teamur 06.03.2018 19:57

laimas,
спасибо Вам, что помогли! Очень ценные ответы!
По поводу 5мб, вы наверное путаете с LocalStorage, но в браузере есть еще одно хранилище данных IndexedDB, которую можно наполнять пока не будет 50% диска и тп.

laimas 06.03.2018 20:01

Цитата:

Сообщение от Teamur
в браузере есть еще одно хранилище данных IndexedDB, которую можно наполнять пока не будет 50% диска

Ну если для себя, то да, но для этого нужно снять ограничение в браузере через манифест, иначе 5 МБ и не выше.


Часовой пояс GMT +3, время: 11:55.