2014-01-10 4 views
8

나는 'template_phash'컬럼을 가진 테이블 A를 가지고있다. 400K 이미지에서 생성 된 phash를 저장합니다.두 개의 phash 사이의 mysql 해밍 거리

이제 임의의 이미지를 가져 와서 그 이미지에서 phash를 생성합니다.

지금 어떻게 내가 해밍 거리의 차이가 임계 값보다 작은 테이블 A에서 레코드를 얻을 수 있도록, 쿼리 내가 Hamming distance on binary strings in SQL을 보았다 (20)

말하지만, 그것을 알아낼 수 없습니다.

나는 이것을 달성하기 위해 기능을 만들 필요가 있다고 생각했지만 어떻게해야합니까?

내 phash의 모두에서 BigInt에 예 : 7641692061273169067는

내가 알아 낸

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

답변

21

처럼 조회 할 수 있도록 나를 해밍 거리가 바로 카운트하는 기능을 도와주세요 두 해시 사이의 서로 다른 비트들. 먼저 두 개의 해시를 계산 한 다음 이진 값의 수를 구합니다.

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

이와 같은 개념! 이 쿼리를 최적화하여 항목의 thousends의 모든 phash를 완전히 비교할 필요가없고 대신 "가장 가까운"값을 한 번만 비교할 수 있습니까? – Manuel