Comparador de Textos

Comparar dos textos lado a lado

Texto A
1
Texto B
1
Entendiendo Comparacion de texto (Diff)
TL;DR

El diff de texto resalta las diferencias exactas entre dos versiones de texto, linea por linea. El mismo algoritmo detras de git diff y las revisiones de codigo.

Que es Diff?

Un diff (abreviatura de “diferencia”) es un algoritmo que compara dos textos e identifica los cambios exactos entre ellos. La salida muestra que lineas fueron agregadas, eliminadas o modificadas, facilitando la comprension de lo que cambio entre dos versiones de un documento.

Diff es una de las herramientas mas fundamentales en ingenieria de software. Cada revision de codigo, cada git diff, cada funcion de “control de cambios” en un editor de documentos depende de algoritmos diff. El concepto fue desarrollado por Douglas McIlroy en Bell Labs, y la primera utilidad diff de Unix se publico en 1974.

El poder del diff radica en su precision. En lugar de decir vagamente “estos archivos son diferentes”, muestra exactamente que lineas cambiaron, de que manera y en que orden. Esto hace que diff sea esencial para el trabajo colaborativo donde multiples personas modifican los mismos documentos.

El algoritmo LCS

La mayoria de las implementaciones de diff se basan en el algoritmo de la Subsecuencia Comun mas Larga (LCS). LCS encuentra la secuencia mas larga de lineas que aparecen en ambos textos en el mismo orden (pero no necesariamente de forma consecutiva). Todo lo que no esta en la LCS es una diferencia.

El algoritmo clasico funciona de la siguiente manera:

  1. Construir una matriz donde las filas representan lineas en el texto A y las columnas representan lineas en el texto B
  2. Llenar la matriz usando programacion dinamica: cada celda registra la longitud de la LCS hasta ese punto
  3. Retroceder a traves de la matriz para identificar que lineas son comunes (sin cambios) y cuales son unicas de cada texto (adiciones o eliminaciones)

El resultado es un conjunto minimo de cambios que transforma el texto A en el texto B. “Minimo” significa que el algoritmo encuentra la menor cantidad posible de adiciones y eliminaciones: no reportara una eliminacion seguida de una adicion cuando una sola modificacion seria suficiente.

La complejidad temporal es O(n*m) donde n y m son el numero de lineas en cada texto. Para archivos muy grandes, algoritmos optimizados como el diff de Myers (usado por Git) reducen esto a O((n+m)*d) donde d es el numero de diferencias, haciendolo mucho mas rapido cuando los textos son mayormente similares.

Formatos de salida

Los resultados de diff pueden mostrarse en varios formatos:

Diff unificado (el mas comun) muestra los cambios con lineas de contexto. Las lineas agregadas tienen el prefijo +, las eliminadas -, y las lineas de contexto sin cambios no tienen prefijo. Este es el formato usado por git diff:

 port=8080
-host=localhost
-debug=false
+host=0.0.0.0
+debug=true
+log_level=info

Diff lado a lado muestra ambos textos en columnas paralelas con los cambios resaltados. Este formato es usado por muchas herramientas diff graficas e interfaces de revision de codigo porque es mas facil de escanear visualmente.

Diff en linea resalta las diferencias a nivel de caracteres dentro de las lineas modificadas. En lugar de mostrar toda la linea antigua y nueva, marca exactamente que caracteres cambiaron, util para lineas largas donde solo una pequena porcion difiere.

Casos de uso comunes

  • Revision de codigo: Revisar pull requests y merge requests examinando exactamente que cambio en cada archivo, linea por linea
  • Auditoria de configuracion: Comparar archivos de configuracion de produccion contra los de staging o linea base para identificar cambios no autorizados
  • Versionado de documentos: Rastrear cambios entre revisiones de documentos (contratos, especificaciones, politicas) sin depender del control de cambios de Word
  • Verificacion de migracion de base de datos: Comparar volcados de esquema antes y despues de la migracion para confirmar que solo se aplicaron los cambios previstos
  • Depuracion de regresiones: Comparar logs, respuestas de API o salidas de pruebas entre una version funcional y una version con errores para aislar el cambio que causo la regresion

Prueba estos ejemplos

Dos versiones de archivo de configuracion Válido

El diff muestra: 'port=8080' sin cambios, 'host' cambio de localhost a 0.0.0.0, 'debug' cambio de false a true, y 'log_level=info' fue agregado. Dos modificaciones y una adicion.

Version A: 'port=8080\nhost=localhost\ndebug=false' vs Version B: 'port=8080\nhost=0.0.0.0\ndebug=true\nlog_level=info'
Textos identicos Válido

Cuando ambos textos son identicos, el diff no produce salida: sin adiciones, sin eliminaciones, sin modificaciones. Esto confirma que las dos versiones son exactamente iguales.

Both inputs: 'The quick brown fox jumps over the lazy dog.'