2014-01-10 133 views
8

我有一个表A有一个'template_phash'列。我存储从400K图像生成的phash。mysql hamming两个phash之间的距离

现在我拍一张随机图像并从该图像生成一个phash。

现在我该怎样查询,这样我可以从表A中的记录,其汉明距离差小于阈值,即20

我见过Hamming distance on binary strings in SQL,但无法弄清楚。

我想我想通了,我需要做一个功能来实现这一点,但如何?

我的两个phash的是BigInt有例如:7641692061273169067

请帮我做的函数,这样我可以查询像

SELECT product_id, HAMMING_DISTANCE(phash1, phash2) as hd 
FROM A 
WHERE hd < 20 ORDER BY hd ASC; 

回答

21

我想通了,海明距离为只是计数这两个哈希之间的不同位。首先xor这两个哈希然后得到二进制的计数:

SELECT product_id, BIT_COUNT(phash1^phash2) as hd from A ORDER BY hd ASC; 
+0

像这个想法!无论如何,优化这个查询是不可能的,不必完全比较物品的每一个物品,而只是比较一次“最接近”的物品。 – Manuel