Расстояние Хэмминга для двоичных строк в SQL

У меня есть таблица в моей базе данных, в которой я храню хэши SHA256 в столбце BINARY (32). Я ищу способ вычислить расстояние Хэмминга записей в столбце до предоставленного значения, то есть что-то вроде:

SELECT * FROM table 
  ORDER BY HAMMINGDISTANCE(hash, UNHEX(<insert supplied sha256 hash here>)) ASC 
  LIMIT 10

(если вам интересно, расстояние Хэмминга строк A и B определяется как BIT_COUNT (A ^ B) , где ^ - это побитовый оператор XOR, а BIT_COUNT возвращает количество единиц в двоичной строке).

Теперь я знаю, что и оператор ^, и функция BIT_COUNT работают только на INTEGER, и поэтому я бы сказал, что, вероятно, единственный способ сделать это - разбить двоичные строки на подстроки, преобразовать каждую двоичную подстроку в целое число, вычислить подстроку расстояния Хэмминга и затем добавить их. Проблема в том, что это звучит ужасно сложно, неэффективно и определенно не элегантно. Поэтому мой вопрос: не могли бы вы предложить лучший способ? (обратите внимание, что я использую общий хостинг, и поэтому я не могу изменять сервер БД или загружать библиотеки)

edit (1): Очевидно, что загрузка всей таблицы в PHP и выполнение вычислений там возможно, но я ' Лучше избегать этого, потому что эта таблица, вероятно, станет довольно большой.

edit (2): Сервер БД - MySQL 5.1

edit (3): Мой ответ ниже содержит код, который я только что описал выше.

edit (4): я только что обнаружил, что использование 4 BIGINT для хранения хэша вместо BINARY (32) дает значительное улучшение скорости (более чем в 100 раз быстрее). См. Комментарии к моему ответу ниже.

23
задан CAFxX 12 February 2011 в 14:18
поделиться