Compare imagens por hash perceptual e distância de Hamming
Dois hashes perceptuais de 16 bits que diferem em 2 posições têm distância de Hamming 2 e semelhança de 87,5 %. Cole duas impressões digitais feitas de zeros e uns e veja o quanto as imagens se parecem sem enviar nenhum arquivo. Grátis no seu navegador.
- Grátis
- Funciona no seu navegador
- Sem cadastro
- Seus dados não saem do seu aparelho
Executar grátis
Exemplo resolvido
- Hash A
- 1011001110001111
- Hash B
- 1011001010101111
- Distância de Hamming
- 2
- Porcentagem de similaridade
- 87,5
- Bits
- 16
Compare duas imagens sem enviar nenhum arquivo quando você já tiver os hashes perceptuais. A ferramenta recebe dois hashes binários de mesmo tamanho, verifica cada posição e informa a distância de Hamming e a porcentagem de similaridade. Distância zero significa que os hashes são iguais; distâncias maiores indicam uma diferença perceptual maior. O cálculo é determinístico, rápido e privado, sendo útil para detectar duplicatas, revisar mídias, conferir migrações e automatizar pipelines de imagens.
Prepare hashes perceptuais realmente comparáveis
Um hash perceptual é uma impressão digital compacta criada para preservar relações visuais, e não os bytes exatos do arquivo. Antes de comparar, gere os dois hashes com o mesmo método, dimensões, quantidade de bits, regras de pré-processamento e convenção de saída. Por exemplo, não compare o hash médio de uma imagem com o hash de diferença de outra, ainda que ambos tenham o mesmo número de bits.
Esta capacidade exige que cada valor seja uma string binária não vazia, formada somente por 0 e 1. Ela rejeita de propósito hexadecimal, separadores, prefixos e espaços, para que cada caractere represente exatamente um bit medido e o resultado não dependa de uma interpretação implícita. As duas strings também precisam ter o mesmo comprimento.
Essa igualdade é indispensável porque a distância de Hamming compara posições correspondentes: os bits adicionais de um hash maior não têm par em um hash menor. Se a sua origem armazena hashes em hexadecimal, converta ambos para strings binárias com preenchimento idêntico antes do envio. Preserve os zeros à esquerda, pois removê-los altera o tamanho declarado e o alinhamento das posições, mesmo que um analisador numérico considere os valores equivalentes.
Entenda a distância e a porcentagem
A distância de Hamming é o número de posições em que os dois hashes contêm bits diferentes. Se dois hashes de 64 bits diferem em cinco posições, a distância é cinco. A porcentagem de similaridade expressa a parcela complementar de posições iguais: divide-se a quantidade de bits coincidentes pelo total de bits e multiplica-se por cem.
Um par diferente em todas as posições retorna uma distância igual ao próprio comprimento e similaridade zero. Interprete a porcentagem como uma comparação normalizada dos hashes, não como uma probabilidade universal de que dois arquivos mostrem o mesmo assunto. Os limites dependem do algoritmo perceptual, do tamanho do hash, do domínio das imagens e do custo de falsos positivos.
Um fluxo de fotos duplicadas pode aceitar somente distâncias muito pequenas, enquanto um agrupamento visual pode usar um limite mais amplo. Calibre essa decisão com correspondências e divergências representativas da sua coleção, em vez de copiar um limite criado para outra família de hashes.
Use o resultado com segurança no pipeline
Um pipeline prático de detecção de duplicatas costuma gerar um hash perceptual consistente por ativo, comparar pares candidatos e depois aplicar uma política à distância obtida. Armazene o método e o comprimento em bits junto de cada impressão digital, para rejeitar registros incompatíveis antes da comparação. Em coleções grandes, use um índice aproximado ou outra etapa de seleção de candidatos; comparar todas as imagens entre si cresce de forma quadrática e raramente é necessário.
Quando um par ficar próximo do limite escolhido, mantenha as imagens originais disponíveis para análise humana ou para uma verificação visual mais detalhada. O hash perceptual tolera algumas transformações e encontra versões redimensionadas ou recomprimidas que checksums criptográficos não detectam, mas também pode aproximar imagens visualmente simples. Esta capacidade não inspeciona pixels, identifica conteúdo nem comprova autoria.
Ela compara apenas as duas strings de bits fornecidas. O cálculo não usa rede, aleatoriedade, relógio nem estado oculto; portanto, o mesmo par válido sempre gera o mesmo resultado.
Casos de uso
Detectar possíveis fotos duplicadas
Compare hashes gerados de modo consistente e encaminhe para revisão os pares abaixo do limite calibrado.
Conferir uma migração de mídia
Confirme se imagens recomprimidas ou redimensionadas no destino continuam perceptualmente próximas das originais.
Agrupar ativos visualmente relacionados
Use a similaridade normalizada como um dos sinais ao organizar um catálogo em possíveis grupos visuais.
Perguntas frequentes
Qual formato de entrada é aceito?
Ambas precisam ter o mesmo número de bits.
Por que os hashes precisam ter o mesmo tamanho?
A distância de Hamming compara posições equivalentes. Strings desiguais deixam posições sem par, por isso a solicitação é recusada.
O que significa uma similaridade de 100 por cento?
Significa que todos os bits fornecidos coincidem. Isso não prova que os arquivos de imagem originais sejam idênticos byte a byte.
Posso comparar hashes criados por algoritmos diferentes?
Não é recomendável. O mesmo tamanho não torna semanticamente comparáveis hashes médios, de diferença e perceptuais.
A ferramenta envia ou inspeciona minhas imagens?
Não. Ela recebe somente as duas strings de hash e executa localmente uma comparação determinística de bits.
Ferramentas relacionadas
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/image/compare-similarity \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"hash_a":"1011001110001111","hash_b":"1011001010101111"}'const res = await fetch("https://api.kit.forhosting.com/image/compare-similarity", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"hash_a": "1011001110001111",
"hash_b": "1011001010101111"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/compare-similarity",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"hash_a": "1011001110001111",
"hash_b": "1011001010101111"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/compare-similarity", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"hash_a":"1011001110001111","hash_b":"1011001010101111"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"hash_a":"1011001110001111","hash_b":"1011001010101111"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/compare-similarity", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"hash_a": "1011001110001111",
"hash_b": "1011001010101111"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.compare_similarity",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_chars | 4096 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |
Notas técnicas
Entenda a distância e a porcentagem
A resposta arredonda a porcentagem para no máximo seis casas decimais, garantindo uma saída JSON estável, enquanto a distância inteira e o total de bits permanecem exatos. Assim, um par idêntico retorna distância zero e cem por cento de similaridade.
Use o resultado com segurança no pipeline
O uso no navegador é gratuito, e as chamadas automatizadas pela API seguem o preço publicado de US$ 0,002 por solicitação.
Perguntas técnicas
Quanto custa uma solicitação de API?
O preço da API é US$ 0,002 por solicitação. A versão no navegador funciona localmente e sem custo.