Comparador de Texto (Diff)

Compare dois textos e veja as diferenças linha a linha.

0 linhas adicionadas, 0 linhas removidas

Diferenças

Escopo: diff linha a linha, via LCS

Divide os dois textos em linhas e calcula a maior subsequência comum (LCS) entre eles — o mesmo princípio usado pelo diff/Git. Linhas fora desse conjunto comum aparecem como removidas (texto antigo) ou adicionadas (texto novo). É comparação por linha inteira, não por palavra ou caractere: mudar uma letra no meio de uma linha marca a linha toda como alterada. Complexidade O(n×m) — textos com dezenas de milhares de linhas podem ficar lentos.

Casos de uso

Tudo roda no navegador via JavaScript — nada do conteúdo colado é enviado a um servidor.

Como o LCS decide o que mudou

Um diff não compara linha 1 com linha 1, linha 2 com linha 2. Se fizesse isso, inserir uma única linha no topo marcaria o arquivo inteiro como alterado.

O que o algoritmo faz é procurar a maior subsequência comum — o maior conjunto de linhas que aparece nos dois textos, na mesma ordem, ainda que não de forma contígua. Essas linhas são o "esqueleto" que os dois textos compartilham e ficam marcadas como inalteradas. Tudo que sobra do lado antigo é remoção; tudo que sobra do lado novo é inserção.

É o mesmo princípio do diff do Unix e do Git, e é por isso que o resultado costuma coincidir com o que você veria em um pull request.

Comparação por linha inteira

A granularidade aqui é a linha. Mudar uma letra no meio de uma frase marca a linha inteira como removida e a nova como adicionada — não há destaque do caractere específico que mudou.

Isso tem uma implicação prática relevante para texto corrido: um parágrafo longo que ocupa uma única linha aparece como totalmente reescrito mesmo que só uma palavra tenha mudado. Se você compara documentos em prosa e precisa enxergar a alteração exata, quebrar o texto em linhas mais curtas — uma frase por linha, por exemplo — melhora bastante a leitura do resultado.

Diferenças invisíveis

A causa mais frustrante de "está tudo marcado como diferente, mas parece igual" são caracteres que você não vê:

Quando o diff acusa mudança em toda parte sem motivo aparente, um desses é quase sempre o culpado.

Desempenho

O algoritmo tem complexidade O(n×m), onde n e m são as quantidades de linhas dos dois textos. Isso é confortável para arquivos de configuração, contratos e trechos de código, mas cresce rápido: dois arquivos de dezenas de milhares de linhas exigem centenas de milhões de comparações e podem travar a aba por alguns segundos.

Para arquivos muito grandes, o caminho é o diff ou o git diff na linha de comando, que usam variantes otimizadas do algoritmo.

Como todo o processamento acontece no seu navegador, dá para comparar contratos, arquivos de ambiente e código proprietário sem que nada saia da máquina. Para conferir se dois textos diferem apenas em acentuação, o removedor de acentos ajuda a normalizar antes da comparação.

Perguntas frequentes

A comparação é linha a linha ou destaca a palavra/caractere exato que mudou?

É diff linha a linha, não palavra a palavra nem caractere a caractere. Se uma única letra mudar no meio de uma linha, a linha inteira aparece como removida (versão antiga) e adicionada (versão nova) — não há destaque no nível do caractere.

Os textos colados são enviados para algum servidor?

Não, todo o cálculo do diff roda no navegador via JavaScript. Seguro para comparar contratos, configs internas ou código proprietário.

Como funciona o algoritmo e há limite de tamanho?

Usa LCS (longest common subsequence) para achar o maior conjunto de linhas comuns, na mesma ordem, entre os dois textos — o mesmo princípio por trás do diff do Git. A complexidade é O(n×m) no número de linhas, então textos muito grandes (dezenas de milhares de linhas) podem ficar perceptivelmente lentos.

Os textos parecem iguais mas tudo aparece como diferente. Por quê?

Quase sempre são caracteres invisíveis: fim de linha CRLF do Windows contra LF do Unix, espaço sobrando no fim da linha, tabulação no lugar de espaços, ou espaço não separável (U+00A0) vindo de texto copiado da web.

Dá para comparar dois parágrafos de texto corrido?

Dá, mas o resultado é pouco informativo: um parágrafo longo em uma única linha aparece como totalmente reescrito ainda que só uma palavra tenha mudado. Quebrar o texto em uma frase por linha antes de colar torna o diff muito mais legível.