2014-01-10 147 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