Artikel
Codefragmenten vergelijken zonder ze te uploaden
Elke keer dat u twee bestanden plakt in een online diff-tool, verlaat die code uw machine. Configuratiebestanden, databasequery's, API-sleutels verborgen in een .env-fragment: dat alles gaat naar een server die u niet beheert. Dit artikel behandelt hoe diff-algoritmen werken, wat granulariteitsopties in de praktijk betekenen, en waarom de vergelijking lokaal houden belangrijk is.
Wat een diff berekent
Een diff-tool neemt twee teksten en vindt de minimale reeks wijzigingen die de ene in de andere omzet. Het kernidee is de langste gemeenschappelijke deelrij, of LCS: de langste reeks regels (of tokens) die in beide teksten in dezelfde volgorde voorkomt, ook als ze niet aangrenzend zijn. Alles wat niet in die gemeenschappelijke deelrij zit, is ofwel een toevoeging in de nieuwe versie of een verwijdering uit de oude. Het klassieke algoritme hiervoor is van Myers (1986), dat het kortste bewerkingsscript vindt in O((N+M)D) tijd, waarbij N en M de lengten van de twee teksten zijn en D het aantal bewerkingen. In de praktijk voegen de meeste tools een voorbewerkingsstap toe om voorloopende gemeenschappelijke regels en afsluitende gemeenschappelijke regels te negeren, waardoor het probleem wordt teruggebracht tot het gewijzigde gebied. Het resultaat is een patch: een reeks blokken, elk beschrijvend een aaneengesloten blok contextregels, verwijderingen en toevoegingen. Dit is het formaat dat wordt gebruikt door Unix diff, Git en de meeste code-reviewtools.

Granulariteit op regel-, woord- en tekenniveau
De granulariteit van een diff bepaalt wat als vergelijkingseenheid wordt beschouwd. Regelgebaseerde diff is de standaard in de meeste tools: elke regel wordt behandeld als één token. Dit is snel en produceert uitvoer die gemakkelijk in context te lezen is, maar markeert een hele regel als gewijzigd, zelfs als slechts één woord op die regel verschilt. Diff op woordniveau splitst elke regel in woorden voor het uitvoeren van LCS. Dit geeft een nauwkeuriger beeld van wat er binnen een regel is gewijzigd, wat nuttig is voor proza, configuratiewaarden of JSON. Diff op tekenniveau gaat verder en kan een enkele gewijzigde letter in een lange identifier markeren. Verwerking van witruimte voegt ruis toe. Een regel die eindigt op CRLF en dezelfde regel die eindigt op LF worden weergegeven als verschillend bij een strikte bytevergelijking. De meeste tools bieden een optie om regeleinden te normaliseren voor het verwerken. Evenzo kunnen afsluitende spaties, inspringing met tabs versus spaties en lege regels allemaal onechte diff-uitvoer produceren. Normalisatie van witruimte inschakelen is doorgaans de juiste standaard bij het vergelijken van code van verschillende editors of besturingssystemen.
Het privacyrisico van online diff-tools
Online diff- en pastebin-services zijn handig: open een URL, plak twee fragmenten en krijg gekleurde uitvoer. Het probleem is dat de tekst die u plakt wordt verzonden naar een server van een derde partij. Afhankelijk van de service kan die tekst worden gelogd, geïndexeerd, voor onbepaalde tijd opgeslagen of gedeeld met analyseproviders. Dit is het meest relevant wanneer de code gevoelig materiaal bevat. Hardgecodeerde inloggegevens, interne hostnamen, bedrijfseigen bedrijfslogica of persoonlijk identificeerbare gegevens kunnen allemaal terechtkomen in een plaksel. Zelfs zonder expliciete geheimen kan de structuur van interne code architectuurbeslissingen onthullen die u liever privé houdt. Het risico is niet hypothetisch. Beveiligingsonderzoekers hebben herhaaldelijk inloggegevens en interne tokens gevonden in openbare plaksels. Sommige services bewaren plaksels ook nadat een gebruiker ze verwijdert, omdat kopieën bestaan in caches of back-ups. Er is geen manier om te verifiëren wat een externe service doet met de tekst zodra die aankomt. De enige betrouwbare maatregel is de diff lokaal te houden, wat betekent dat u het uitvoert in een tool die de tekst nooit over het netwerk verstuurt.

Praktische toepassingen voor een lokale diff
Diff is niet alleen voor code-review. Een paar veelvoorkomende gevallen waarbij een lokale diff nuttig is: Bijhouden van bewerkingen aan een document of configuratiebestand voor het vastleggen. Twee versies van een Dockerfile, een Nginx-configuratie of een Kubernetes-manifest vergelijken om precies te begrijpen wat er tussen implementaties is veranderd. Configuratie-afwijking tussen omgevingen controleren. Als productie- en stagingconfiguraties identiek zouden moeten zijn behalve hostnamen en geheimen, toont een diff onmiddellijk elke onbedoelde afwijking. API-reacties vergelijken tijdens het debuggen. Twee JSON-payloads van een REST of GraphQL API plakken en een diff op woordniveau uitvoeren, geeft nauwkeurig toegevoegde velden, gewijzigde waarden of verwijderde sleutels aan zonder honderden regels handmatig door te lezen. Door een taalmodel gegenereerde code vergelijken met een basislijn. Wanneer een model een functie herschrijft, toont een diff op regelniveau welke logica is veranderd en welke hetzelfde is gebleven, sneller dan beide versies onafhankelijk te lezen. In al deze gevallen kan de betrokken tekst gevoelig zijn, en het buiten een externe server houden is de voor de hand liggende keuze.
In de browser doen, zonder uploaden
De text-diff tool op deze site voert de volledige diff-berekening uit in uw browser met JavaScript. U plakt twee teksten in de twee panelen en de diff wordt onmiddellijk weergegeven, regel voor regel, tot 3000 regels per kant. Er wordt niets naar een server verzonden. De tekst verlaat uw apparaat nooit. De implementatie gebruikt een standaard LCS-gebaseerd algoritme dat op regels werkt: elke regel is een token, en de tool bepaalt of die ongewijzigd, toegevoegd of verwijderd is door de langste gemeenschappelijke deelrij tussen de twee versies te zoeken. Ongewijzigde regels worden zonder markering weergegeven, toegevoegde regels in groen, verwijderde regels in rood, naast een lopende telling van toevoegingen en verwijderingen. Er is vandaag geen woord- of tekenniveau-modus en geen schakelaar voor witruimtenormalisatie, dus een regel die alleen verschilt in trailing witruimte of regeleindestijl wordt nog steeds als gewijzigd getoond. Omdat de berekening client-side draait, werkt het offline. Er is geen account, geen geschiedenis, geen bewaring. U kunt een lokaal configuratiebestand vergelijken met een sjabloon, een patch bekijken voor het toepassen, of twee API-reacties controleren zonder dat die tekst een derde partij bereikt.
Tools in dit artikel
Veelgestelde vragen
Is diff op regelniveau of woordniveau beter voor code?
Voor de meeste code-reviewtaken is diff op regelniveau de standaard en het gemakkelijkst te lezen, omdat code gestructureerd is per regel. Diff op woordniveau kan helpen wanneer regels lang zijn en slechts een klein gedeelte is gewijzigd, zoals in een JSON-waarde op één regel, maar deze tool vergelijkt alleen op regelniveau; gebruik in dat geval de gemarkeerde regel als aanwijzing en speur het kleinere verschil er zelf in op.
Waarom vormen online diff-tools een privacyrisico, zelfs als ze HTTPS gebruiken?
HTTPS beschermt de tekst tijdens transport tegen afluisteren, maar niet zodra deze de server bereikt. De servicebeheerder heeft volledige toegang tot de geplakte inhoud en kan deze loggen, opslaan of delen. TLS gaat over transportbeveiliging, niet over wat de ontvanger met de gegevens doet.
Slaat de text-diff tool een geschiedenis op van eerdere vergelijkingen?
Nee. De tool heeft geen backend en doet geen netwerkverzoeken. Zodra u het tabblad sluit of herlaadt, is de tekst weg. Er is geen account, geen opgeslagen geschiedenis en geen serverlogboek.