我正在尝试计算输入哈希和数据库存储的哈希之间的汉明距离。这些是感知散列,所以它们之间的汉明距离对我来说很重要,并告诉我两个不同的图像有多相似(参见http://en.wikipedia.org/wiki/Perceptual_hashing,http://jenssegers.com/61/感知图像哈希,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?