mysql расстояние Хэмминга между двумя phash

У меня есть таблица A, которая имеет столбец 'template_phash'. Я храню phash, созданный из 400K изображений.

теперь я беру случайное изображение и генерирую 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;

1 ответов


Я понял, что расстояние Хэмминга-это просто количество разных битов между двумя хэшами. Сначала xor два хэша, а затем получить количество двоичных:

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