Mysql преобразует поле двоичного представления varchar в двоичное, чтобы выполнить расчет расстояния Хэмминга с помощью bit_count

У меня есть таблица БД с полем varchar(64) для хранения данных PHashing в виде 64 символов (1 и 0 символов ascii). Мне нужно рассчитать расстояние Хэмминга с помощью тестовой хасты, и кажется, что наиболее эффективный способ сделать это — использовать функцию mysql bit_count. Проблема в том, что я не нашел никакого способа конвертировать/преобразовать/любое хеш-поле, чтобы оно интерпретировалось как byte(8) вместо varchar(64). Нравиться:

> select hash from data;
"0000000101100111111100011110000011100000111100011011111110011011"
> select convert_to_binary(hash) from data;
0b0000000101100111111100011110000011100000111100011011111110011011

Я не могу изменить данные и преобразовать все предыдущие данные в двоичное поле. Есть ли способ заставить mysql переинтерпретировать поле как литерал или любое другое альтернативное решение?


person sucotronic    schedule 04.12.2014    source источник


Ответы (2)


Я думаю, вы должны иметь возможность использовать его следующим образом:

ВЫБЕРИТЕ BIT_COUNT (CAST (хэш КАК ДВОИЧНЫЙ)) ИЗ данных;

Используйте CAST, чтобы преобразовать поле в BINARY и передать результат BIT_COUNT. Приведение хэша поля к двоичному типу превратит его в строку с двоичным типом данных, но BIT_COUNT может с этим справиться.

person Louis Huppenbauer    schedule 04.12.2014
comment
Кастинг производит 64-байтовые данные, поэтому я не могу сравнить их с 64-битным литералом. Я также могу преобразовать литерал из строки в двоичный код, но это дает неправильные результаты. Например, select bit_count(cast(011 как двоичный)^cast(111 как двоичный)) возвращает 3, а select bit_count(cast(101 как двоичный)^cast(111 как двоичный)) возвращает 2. Если вы делаете это с двоичными данными, ответ в порядке и всегда 1: выбрать бит_счетчик(0b101^0b111), выбрать бит_счетчик(0b011^0b111)< /б> - person sucotronic; 05.12.2014

Рабочий код:

SELECT BIT_COUNT( CONV( hash, 2, 10 ) ^ 
0b0000000101100111111100011110000011100000111100011011111110011011 )
person sucotronic    schedule 11.12.2014