Articolo
Confrontare frammenti di codice senza caricarli
Ogni volta che si incollano due file in uno strumento di diff online, quel codice lascia la macchina. File di configurazione, query di database, chiavi API sepolte in un frammento .env: tutto viaggia verso un server che non si controlla. Questo articolo spiega come funzionano gli algoritmi di diff, cosa significano le opzioni di granularità nella pratica e perché mantenere il confronto locale è importante.
Cosa calcola un diff
Uno strumento di diff prende due testi e trova il set minimo di modifiche che converte uno nell'altro. L'idea centrale è la sottosequenza comune più lunga, o LCS: la sequenza più lunga di righe (o token) che appare in entrambi i testi nello stesso ordine, anche se non adiacenti. Tutto ciò che non è in quella sottosequenza comune è un'aggiunta nella nuova versione o una cancellazione dalla vecchia. L'algoritmo classico per questo è dovuto a Myers (1986), che trova lo script di modifica più breve in O((N+M)D) tempo, dove N e M sono le lunghezze dei due testi e D è il numero di modifiche. In pratica, la maggior parte degli strumenti aggiunge un passaggio di pre-elaborazione per ignorare le righe comuni iniziali e quelle finali, riducendo il problema alla regione modificata. Il risultato è una patch: una sequenza di blocchi, ognuno che descrive un blocco contiguo di righe di contesto, cancellazioni e aggiunte. Questo è il formato usato da Unix diff, Git e dalla maggior parte degli strumenti di revisione del codice.

Granularità a riga, parola e carattere
La granularità di un diff determina cosa conta come unità di confronto. Il diff basato su righe è quello predefinito nella maggior parte degli strumenti: ogni riga è trattata come un singolo token. Questo è rapido e produce output facile da leggere nel contesto, ma contrassegna un'intera riga come modificata anche se è cambiata solo una parola su quella riga. Il diff a livello di parola divide ogni riga in parole prima di eseguire LCS. Questo fornisce un quadro più dettagliato di ciò che è cambiato all'interno di una riga, utile per prosa, valori di configurazione o JSON. Il diff a livello di carattere va oltre e può evidenziare una singola lettera cambiata all'interno di un lungo identificatore. La gestione degli spazi bianchi aggiunge rumore. Una riga che termina in CRLF e la stessa riga che termina in LF appariranno diverse sotto un confronto byte per byte rigoroso. La maggior parte degli strumenti offre un flag per normalizzare le terminazioni di riga prima del diff. Allo stesso modo, spazi finali, indentazione tabulazione-versus-spazio e righe vuote possono produrre output di diff spurio. Abilitare la normalizzazione degli spazi bianchi è di solito l'impostazione predefinita corretta quando si confronta codice da editor o sistemi operativi diversi.
Il rischio per la privacy degli strumenti di diff online
I servizi di diff e pastebin online sono comodi: aprire un URL, incollare due frammenti, ottenere un output colorato. Il problema è che il testo che si incolla viene trasmesso a un server di terze parti. A seconda del servizio, quel testo può essere registrato, indicizzato, memorizzato indefinitamente o condiviso con fornitori di analisi. Questo è più rilevante quando il codice contiene materiale sensibile. Credenziali codificate, nomi host interni, logica aziendale proprietaria o dati personalmente identificabili possono tutti finire in un paste. Anche senza segreti espliciti, la struttura del codice interno può rivelare decisioni architetturali che si preferisce mantenere private. Il rischio non è ipotetico. I ricercatori di sicurezza hanno ripetutamente trovato credenziali e token interni nei paste pubblici. Alcuni servizi conservano i paste anche dopo che un utente li ha eliminati, perché esistono copie in cache o backup. Non c'è modo di verificare cosa fa un servizio remoto con il testo una volta che arriva. L'unica mitigazione affidabile è mantenere il diff locale, il che significa eseguirlo in uno strumento che non invia mai il testo sulla rete.

Usi pratici di un diff locale
Il diff non è solo per la revisione del codice. Alcuni casi comuni in cui un diff locale è utile: Revisione delle modifiche a un documento o file di configurazione prima del commit. Confronto di due versioni di un Dockerfile, una configurazione Nginx o un manifest Kubernetes per capire esattamente cosa è cambiato tra i deployment. Verifica della deriva della configurazione tra ambienti. Se le configurazioni di produzione e staging dovrebbero essere identiche tranne per i nomi host e i segreti, un diff mostra immediatamente qualsiasi divergenza non intenzionale. Confronto delle risposte API durante il debug. Incollare due payload JSON da una API REST o GraphQL ed eseguire un diff a livello di parola individua i campi aggiunti, i valori modificati o le chiavi rimosse senza leggere centinaia di righe manualmente. Revisione del codice generato da un LLM rispetto a una baseline. Quando un modello riscrive una funzione, un diff a livello di riga mostra quale logica è cambiata e quale è rimasta uguale, più velocemente che leggere entrambe le versioni indipendentemente. In tutti questi casi, il testo coinvolto può essere sensibile e mantenerlo fuori da un server remoto è la scelta più diretta.
Farlo nel browser, senza caricare nulla
Lo strumento text-diff su questo sito esegue l'intero calcolo del diff nel browser usando JavaScript. Si incollano due testi nei due pannelli e il diff viene visualizzato immediatamente, riga per riga, fino a 3000 righe per lato. Niente viene inviato a un server. Il testo non lascia mai il dispositivo. L'implementazione usa un algoritmo standard basato su LCS che opera sulle righe: ogni riga è un token, e lo strumento determina se è invariata, aggiunta o rimossa trovando la sottosequenza comune più lunga tra le due versioni. Le righe invariate vengono mostrate senza evidenziazione, le righe aggiunte in verde, le righe rimosse in rosso, accanto a un conteggio in tempo reale di aggiunte e cancellazioni. Non esiste oggi una modalità a livello di parola o di carattere né un interruttore per la normalizzazione degli spazi bianchi, quindi una riga che differisce solo per spazi finali o per lo stile di fine riga viene comunque mostrata come modificata. Poiché il calcolo viene eseguito lato client, funziona offline. Non c'è account, nessuna cronologia, nessuna conservazione. Si può confrontare un file di configurazione locale con un template, rivedere una patch prima di applicarla o controllare due risposte API senza che nessuno di quei testi raggiunga terze parti.
Strumenti citati in questo articolo
Domande frequenti
Il diff basato su righe o quello basato su parole è migliore per il codice?
Per la maggior parte delle attività di revisione del codice, il diff basato su righe è lo standard e il più facile da leggere, perché il codice è strutturato per righe. Il diff basato su parole può aiutare quando le righe sono lunghe e solo una piccola parte è cambiata, come in un valore JSON su una singola riga, ma questo strumento confronta solo a livello di riga; in quel caso, usa la riga evidenziata come indicatore e individua a occhio la differenza più piccola al suo interno.
Perché gli strumenti di diff online rappresentano un rischio per la privacy anche se usano HTTPS?
HTTPS protegge il testo in transito dalle intercettazioni, ma non lo protegge una volta che raggiunge il server. L'operatore del servizio ha pieno accesso al contenuto incollato e può registrarlo, memorizzarlo o condividerlo. TLS riguarda la sicurezza del trasporto, non ciò che il destinatario fa con i dati.
Lo strumento text-diff memorizza qualche cronologia dei confronti passati?
No. Lo strumento non ha backend e non fa richieste di rete. Una volta chiusa o ricaricata la scheda, il testo è sparito. Non c'è account, nessuna cronologia salvata e nessun log lato server.