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;
Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top