Как проверить уникальность 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 не помогает ( |
Сравнивать хеш. Облегченный хеш - https://habrahabr.ru/post/120562/
Стоит добавить, что в 2014 эксперт Нэт Макхью сообщил о создании двух разных изображений имеющих одинаковый MD5 хеш. Вряд ли кто-то будет испытывать вас такой коллизией, но об этом нужно знать. |
laimas,
спасибо, почитаю. Нэт Макхью - не знаю кто это, но с тех пор прошло 4 года. ) |
Цитата:
В вашем случае, это просто знать, что коллизии возможны. Не известна конечная цель вашей затеи, а значит и какова цена возможной ошибки. |
laimas,
Цель: Мне нужно загружать файлы с компьютера и сохранять их в IndexedDB, чтобы не было повторений. |
Ну тогда и проблем нет. И может проверки на имя хватит? И зачем же забивать базу такими данными?
|
laimas,
Если загружать картинки с различной периодичностью, в разное время, с разных носителей, есть большая вероятность что я забуду, что какую-то из них я уже добавлял в проект. Дома я буду создавать статьи, книжки и тп и, чтобы информация не потерялась, она будет храниться в БД браузера. Затем когда результат меня устроит, я отправлю статью на сервер. Серверная часть на NodeJS! |
Базы могут хранить BLOB, но забивать ими базу, а не хранить изображения в каталогах, это больше минусов, чем плюсов. Можно ведь в базе хранить только ссылку на изображение, а ее проверить можно.
|
laimas, ))
Но каталоги могут гулять, картинки тоже перемещаться и тп. По поводу перцептивного хэша - я думаю у меня сто лет уйдет на написание функции. Я то думал, что проверить уникальность не сложно. Блин, буду искать pHash на Javascript. И как назло это будет 100 кб скрипт. |
А Дискретное Косинусное Преобразование вообще 'убило' )
|
|
Цитата:
|
laimas,
на сервере они будут лежать в спецпапке. Вот такой, наверное, смешной вопрос еще: А можно ли во время загрузки картинки просто получить, скажем, первые 100 байт этого файла, а затем если снова загружается такая же картинка - просто проверяем байты и, если они совпадает с сохраненной в Set'e последовательностью выводим сообщение о том что такой файл есть! |
Цитата:
И на клиенте тоже самое. Да и вообще, уж коли это для себя, то может ну его на... браузер и работать без ограничений? Ну или максимально убрать ограничения и использовать то, что "смертным" запрещено. Цитата:
|
laimas,
тогда последние 100 байт или из середины! То есть брать оттуда где точно нет информации о заголовках, разрешении, глубине и тп И почему если блоб вставить в img.src он будет разным, хотя изображения одинаковые? |
Цитата:
Цитата:
|
Не могу поверить, что простая проверка одинаковости файлов, выливается в такие проблемы!
Загружаем картинку с одним именем, затем такую же, но с другим именем и ВСЁ нужно сравнивать Хэши и тп. Невероятно! У файлов только имя поменялось, а тут такая история ))) Мда... А в моём случае даже имя не менялось. Что за тупизм! Разочарован ) |
Цитата:
Правда абсурд? |
Попали в отделение (загрузили файл), сняли с вас пальчики, пробили по базе - о!
- Вы никакой не садовник, вы - косой! Всё просто! )) |
То есть в любом случае нужно потрудится, проверить, а не брать на веру. А разве с файлами нужно поступать иначе?
|
laimas,
нап. возьмем картинку 10х10 пикселей. если методом fetch прочитать файл как текст, то крякозябры у этого файла будут одни, а другого -другие. Загружаем снова этот файл - такие же крякозябры -> alert('тот же файл!') В данном примере легко все обходится без MD5, суперхэшей и тп. |
Цитата:
В базе хранят уникальный оттиск, по которому и производят сравнение. Одним из способов получения такого оттиска является хеш изображения. Я вас не уговариваю, делайте что хотите, 10х10 ли картинки, больше ли. Сам подход ваш не очень удачен - BLOB в базе, которая ограничена размером 5 МБ, это большая роскошь и дай бог, чтобы хватило. Нужен надежный механизм гарантирующий отсутствие дубликатов, но при этом то-ли себя, то-ли кого пытаетесь убедить не делать этого. Я сказал все, что можно было сказать по этому вопросу, а вы поступайте так как хотите. |
laimas,
спасибо Вам, что помогли! Очень ценные ответы! По поводу 5мб, вы наверное путаете с LocalStorage, но в браузере есть еще одно хранилище данных IndexedDB, которую можно наполнять пока не будет 50% диска и тп. |
Цитата:
|
Часовой пояс GMT +3, время: 11:55. |