, что соответствует количеству единиц в

я есть таблица в моей БД, где я храню хэши 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 возвращает число 1 в двоичной строке).

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

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

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

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

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

Ответы на вопрос(2)

Ваш ответ на вопрос