У меня есть таблица в моей базе данных, в которой я храню хэши 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 раз быстрее). См. Комментарии к моему ответу ниже.