2014-01-10 9 views
8

Ich habe eine Tabelle A, die eine Spalte 'template_phash' hat. Ich speichere den aus 400K-Bildern generierten Phash.mysql Hamming Abstand zwischen zwei phash

Jetzt nehme ich ein zufälliges Bild und erzeuge einen Phash von diesem Bild.

Nun, wie ich abfragen, so dass ich den Datensatz aus Tabelle A bekommen, die Hamming-Distanz Differenz kleiner als ein Schwellenwert ist, sage 20

ich Hamming distance on binary strings in SQL gesehen habe, kann aber nicht herausfinden.

Ich denke, ich habe herausgefunden, dass ich eine Funktion machen muss, um dies zu erreichen, aber wie?

Beide meiner phash sind in BigInt zB: 7641692061273169067

Bitte helfen Sie mir die Funktion zu machen, so dass ich wie

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

Antwort

21

ich, dass die Hamming-Distanz die Zählung heraus abfragen konnte einfach von verschiedenen Bits zwischen den zwei Hashes. Zuerst xoder die zwei Hashes erhalten dann die Anzahl der binären Einsen:

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

Gefällt mir diese Idee! Ist es überhaupt möglich, diese Abfrage zu optimieren, um nicht jeden Phasenwechsel von Gegenständen komplett vergleichen zu müssen und stattdessen nur einmal den "nächsten" zu vergleichen? – Manuel