powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / хранение и обработка перцептивного хэша в БД
10 сообщений из 10, страница 1 из 1
хранение и обработка перцептивного хэша в БД
    #37751370
XMalon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я близок к нулю в проектировании и работе с БД (нет, конечно как создавать таблицы и писать sql-запросы я выучил, но не более того), а ситуация такая: имеется необходимость хранения 64-битного перцептивного хэша (использую для сравнения изображений); суть перцептивного хэша (и в этом-то для меня вся проблема работы с ним в БД) заключается в том, что по нему можно не только сказать что сравниваемые изображения возможно идентичны или не идентичны (то есть да или нет), а и уточнить с какой степенью вероятности; из выше написанного возникает необходимость запроса который бы выбрал из таблицы все записи у которых 64-битное значение совпадает с искомым не обязательно по всем 64-м разрядам, а может например по 50-ти, 45-ти (некоторое пороговое значение (заранее определенное)). В поисковике ничего не нашел (наверное, просто пока не знаю что ищу). Буду рад если вы мне поможете ссылками на соответствующие ресурсы, форумы, статьи и пр.
Как выгоднее хранить эти 64 бита и как производить поиск по ним как описано выше ? (записей не более 500 000)
...
Рейтинг: 0 / 0
хранение и обработка перцептивного хэша в БД
    #37751376
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMalonКак выгоднее хранить эти 64 бита и как производить поиск по ним как описано выше ?
(записей не более 500 000)

Разбить биты на отдельные записи. Потом группировка изображений с совпадающими битами и
фильтрация по HAVING COUNT(*)>40.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
хранение и обработка перцептивного хэша в БД
    #37751428
XMalon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovРазбить биты на отдельные записи. Потом группировка изображений с совпадающими битами и
фильтрация по HAVING COUNT(*)>40.


ну я так понимаю, раз уж мы группируем все таки изображения, значит having count (*)>40 будет проверять количество изображений, а не записей с битами. и что это за условие "с совпадающими битами" (что имелось ввиду ? - полное совпадение чтоли ?). В общем не понятно, уже пол часа пытаюсь понять Вашу мысль, но не доходит, все равно спасибо )
...
Рейтинг: 0 / 0
хранение и обработка перцептивного хэша в БД
    #37751457
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, например, для некоего образца у вас получилось значение хэша 13. Пусть оно
четырёхбитное. Тогда в таблицу добавляется четыре записи с значениями (1, -2, 3, 4). Здесь
положительные числа - бит установлен, отрицательные - сброшен.

Далее у вас есть для проверки изображение с хэшем 12. Его набор битов, соответственно (-1,
-2, 3, 4).

Делается запрос
Код: sql
1.
2.
3.
SELECT COUNT(*) FROM T
WHERE Value in (-1, -2, 3, 4)
GROUP BY id


Для вышеприведённого образца этот запрос вернёт 3, т.е. в заданном хэше с данным образцом
совпадают три бита. HAVING позволит ограничивать выборку нужным числом совпадающих бит.

Это, конечно, только исходя из предположения, что все биты хэша имеют равный вес...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
хранение и обработка перцептивного хэша в БД
    #37751468
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMalonКак выгоднее хранить эти 64 бита и как производить поиск по ним как описано выше ? (записей не более 500 000)
Мне кажется, самый простой и эффективный способ хранения такого хэша - отдельное поле с типом данных "большое целое" (64 бита).

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

Не долго думая (или совсем не думая) алгоритм вычисления значения "в общем виде" примерно такой:
1) битовое исключающее ИЛИ между значением поля таблицы и значением хэша, которое нужно найти - во всех несовпадающих битах будет установлена 1.
2) для полученного результата подсчитывается количество установленных бит (т.е. несовпадений).
3) получить на основе этого значения количество совпадений (64 минус количество несовпадений).

Запрос на SQL может выглядеть примерно так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT *
FROM table_with_hash
WHERE (64 -
 /* ...и 64 раза двигаем бит от самого младшего к самому старшему... */
case when (record_hash ^ seacrh_hash) & 0x0000000000000001 = 0 then 0 else 1 end +
case when (record_hash ^ seacrh_hash) & 0x0000000000000002 = 0 then 0 else 1 end +
... +
case when (record_hash ^ seacrh_hash) & 0x4000000000000000 = 0 then 0 else 1 end
) >= criteria


Можно обернуть подсчет количества установленных битов в функцию...
Жесть, конечно, но где-то так...
...
Рейтинг: 0 / 0
хранение и обработка перцептивного хэша в БД
    #37751475
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvЖесть, конечно

Мой вариант хоть и заставит распухнуть базу, но хоть индекс использовать может...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
хранение и обработка перцептивного хэша в БД
    #37751495
XMalon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем огромное спасибо, особенно Dimitry Sibiryakov, решение супер, с учетом всех требований, я бы сам до него не додумался, простой запрос, а вся необходимая информация как на ладони ))
...
Рейтинг: 0 / 0
хранение и обработка перцептивного хэша в БД
    #37751496
XMalon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

в моем случае главное скорость. с объемом дискового пространства проблем никаких, да и тем более изображений не так много (не более 500 000), еще раз спс )
...
Рейтинг: 0 / 0
хранение и обработка перцептивного хэша в БД
    #37751502
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovsphinx_mvЖесть, конечно

Мой вариант хоть и заставит распухнуть базу, но хоть индекс использовать может...

...А может и не использовать... Эффективность индексов - величина не абсолютная.
К тому же выполнять многократные запросы к серверу рано или поздно приведет к проблемам с производительностью.

К тому же, я бы сказал, что SQL для непосредственного решения подобной задачи не очень хороший инструмент.
Проще (и, наверное, правильнее) выгрузить на клиента массив из "ID" и "HASH" (для заявленного количества записей получается всего каких-то жалких 8 мегабайт объема данных) и манипулировать ими любым желаемым способом...
...
Рейтинг: 0 / 0
хранение и обработка перцептивного хэша в БД
    #37751855
eny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
eny
Гость
Есть замечательные инструменты в SQL это внешние функции и внешние агрегирующие функции (программируются на C#) - в них можно реализовать необходимую логику изапросы будут красивыми и структура базы данных.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / хранение и обработка перцептивного хэша в БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]