У меня есть таблица в моей БД, где я храню хэши 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 возвращает число 1s в двоичной строке).
Теперь я знаю, что и функция operator ^, и функция BIT_COUNT работают только с INTEGER, поэтому я бы сказал, что, вероятно, единственный способ сделать это - разбить двоичные строки в подстроках, отбросить каждую двоичную подстроку на целое число, вычислите расстояние Хэмминга подстрокой, а затем добавьте их. Проблема в том, что это звучит ужасно сложно, неэффективно и определенно не изящно. Поэтому мой вопрос: можете ли вы предложить лучший способ? (учтите, что я нахожусь на общем хостинге, поэтому я не могу изменять сервер БД или загружать библиотеки)
edit (1): Очевидно, что загрузка всей таблицы на PHP и выполнение вычислений было бы возможно, но я бы предпочел избежать этого, потому что эта таблица, вероятно, будет расти довольно.
edit (2): Сервер БД - это MySQL 5.1
edit (3): Мой ответ ниже содержит код, который я только что описал выше.
edit (4): Я только узнал, что использование 4 BIGINT для хранения хэша вместо BINARY (32) дает значительные улучшения скорости (более чем в 100 раз быстрее). См. Комментарии к моему ответу ниже.