14

「template_phash」列を持つテーブル A があります。400K の画像から生成された phash を保存します。

次に、ランダムな画像を取得し、その画像から phash を生成します。

テーブル A から、ハミング距離の差がしきい値 (たとえば 20) 未満のレコードを取得できるようにクエリを実行するにはどうすればよいでしょうか。

SQL のバイナリ文字列のハミング距離を見たことがありますが、理解できませんでした。

これを達成するには関数を作成する必要があることがわかったと思いますが、どうすればよいですか?

私のphashは両方ともBigIntにあります。例:7641692061273169067

次のようにクエリできるように関数を作成するのを手伝ってください

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

1 に答える 1

30

ハミング距離は、2 つのハッシュ間の異なるビットの数にすぎないことがわかりました。最初に 2 つのハッシュを xor し、バイナリ 1 の数を取得します。

SELECT product_id, BIT_COUNT(phash1 ^ phash2) as hd from A ORDER BY hd ASC;
于 2014-01-11T05:31:06.343 に答える