Я пытаюсь рассчитать расстояние Хэмминга между входным хешем и хешами, хранящимися в базе данных. Это перцептивные хэши, поэтому расстояние Хемминга между ними важно для меня и говорит мне, насколько похожи два разных изображения (см. http://en.wikipedia.org/wiki/Perceptual_hashing, http://jenssegers.com/61/perceptual-image-hashes, http://stackoverflow.com/questions/21037578/< /а>). Хеши состоят из 16 шестнадцатеричных символов и выглядят следующим образом:
b1d0c44a4eb5b5a9
1f69f25228ed4a31
751a0b19f0c2783f
Моя база данных выглядит так:
CREATE TABLE `hashes` (
`id` int(11) NOT NULL,
`hash` binary(8) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
INSERT INTO `hashes` (`id`, `hash`) VALUES
(1, 0xb1d0c44a4eb5b5a9),
(2, 0x1f69f25228ed4a31),
(3, 0x751a0b19f0c2783f);
Теперь я знаю, что могу запросить расстояние Хэмминга следующим образом:
SELECT BIT_COUNT(0xb1d0c44a4eb5b5a9 ^ 0x751a0b19f0c2783f)
Который выведет 38, как и ожидалось. Однако я не могу сослаться на имя столбца для этого сравнения. Следующее не работает должным образом.
SELECT BIT_COUNT(hash ^ 0x751a0b19f0c2783f) FROM hashes
Кто-нибудь знает, как я могу рассчитать расстояние Хэмминга, как в моем первом SELECT
запросе выше, используя столбцы в моей базе данных? Я испробовал множество сценариев, используя hex()
, unhex()
, conv()
и cast()
по-разному. Это в MySQL.
Обновление Мой запрос выше работает должным образом при работе в MySQL v8 (спасибо @LukStorms за указание на это). Вы можете использовать мою скрипку ниже и изменить версию в левом верхнем углу. Теперь у меня вопрос: как я могу убедиться, что поведение работает во всех версиях MySQL?
Скрипт: https://www.db-fiddle.com/f/mpqsUpZ1sv2kmvRwJrK5xL/0< /а>