mysql hamming distância entre dois phash
-
21-12-2019 - |
Pergunta
Eu tenho uma tabela A que possui uma coluna 'template_phash'.Eu armazeno o phash gerado a partir de imagens de 400K.
Agora pego uma imagem aleatória e gero um phash a partir dessa imagem.
Agora, como faço para consultar para obter o registro da tabela A cuja diferença de distância de Hamming é menor que um valor limite, digamos 20.
Eu tenho visto Distância de Hamming em strings binárias em SQL, mas não consegui descobrir.
Acho que descobri que preciso criar uma função para conseguir isso, mas como?
Ambos os meus phash estão em BigInt, por exemplo:7641692061273169067
Por favor me ajude a fazer a função para que eu possa consultar como
SELECT product_id, HAMMING_DISTANCE(phash1, phash2) as hd
FROM A
WHERE hd < 20 ORDER BY hd ASC;
Solução
Eu descobri que a distância de Hamming é apenas a contagem de bits diferentes entre os dois hashes.Primeiro xor os dois hashes e depois obtenha a contagem dos binários:
SELECT product_id, BIT_COUNT(phash1 ^ phash2) as hd from A ORDER BY hd ASC;