Artikel
Sammenlign kodestykker uden at uploade dem
Hver gang du indsætter to filer i et online diff-værktøj, forlader den kode din maskine. Konfigurationsfiler, databaseforespørgsler, API-nøgler begravet i et .env-uddrag: alt det rejser til en server, du ikke kontrollerer. Denne artikel gennemgår, hvordan diff-algoritmer fungerer, hvad granularitetsmuligheder betyder i praksis, og hvorfor det er vigtigt at holde sammenligningen lokal.
Hvad en diff beregner
Et diff-værktøj tager to tekster og finder det minimale sæt af ændringer, der konverterer den ene til den anden. Kerneideen er den længste fælles delsekvens eller LCS: den længste sekvens af linjer (eller tokens), der optræder i begge tekster i samme rækkefølge, selv om de ikke er tilstødende. Alt, der ikke er i den fælles delsekvens, er enten en tilføjelse i den nye version eller en sletning fra den gamle. Den klassiske algoritme for dette skyldes Myers (1986), som finder det korteste redigeringsscript i O((N+M)D) tid, hvor N og M er længderne af de to tekster og D er antallet af redigeringer. I praksis tilføjer de fleste værktøjer et forbehandlingstrin for at ignorere ledende fælles linjer og afsluttende fælles linjer, hvilket reducerer problemet til den ændrede region. Resultatet er en patch: en sekvens af hunks, der hver beskriver en sammenhængende blok af kontekstlinjer, sletninger og tilføjelser. Dette er det format, der bruges af Unix diff, Git og de fleste kodegennemgangsværktøjer.

Linje-, ord- og tegngranularitet
Granulariteten af en diff bestemmer, hvad der tæller som en sammenligningsenhed. Linjebaseret diff er standarden i de fleste værktøjer: hver linje behandles som et enkelt token. Det er hurtigt og producerer output, der er let at læse i kontekst, men det markerer en hel linje som ændret, selv om kun ét ord på den linje er anderledes. Ordniveau-diff opdeler hver linje i ord inden LCS køres. Det giver et finere billede af, hvad der ændrede sig inden for en linje, hvilket er nyttigt for prosa, konfigurationsværdier eller JSON. Tegniveaudiff går videre og kan fremhæve et enkelt ændret bogstav inde i et langt id. Håndtering af blanktegn tilføjer støj. En linje, der slutter med CRLF, og den samme linje, der slutter med LF, vil fremstå som forskellige under en streng bytesammenligning. De fleste værktøjer tilbyder et flag til at normalisere linjeskift inden diffing. Tilsvarende kan efterfølgende mellemrum, tabulator-vs.-mellemrum-indrykning og tomme linjer alle producere overflødig diff-output. Aktivering af normalisering af blanktegn er normalt det rigtige standard, når man sammenligner kode fra forskellige editorer eller operativsystemer.
Privatlivsrisikoen ved online diff-værktøjer
Online diff- og pastebin-tjenester er bekvemme: åbn en URL, indsæt to uddrag, få et farvet output. Problemet er, at den tekst, du indsætter, overføres til en tredjeparts server. Afhængigt af tjenesten kan den tekst blive logget, indekseret, lagret på ubestemt tid eller delt med analyseudbydere. Det betyder mest, når koden indeholder følsomt materiale. Hardkodede legitimationsoplysninger, interne værtsnavne, proprietær forretningslogik eller personligt identificerbare data kan alle ende i en indsætning. Selv uden eksplicitte hemmeligheder kan strukturen af intern kode afsløre arkitekturbeslutninger, du helst vil holde private. Risikoen er ikke hypotetisk. Sikkerhedsforskere har gentagne gange fundet legitimationsoplysninger og interne tokens i offentlige indsætninger. Nogle tjenester bevarer indsætninger, selv efter at en bruger sletter dem, fordi kopier findes i caches eller sikkerhedskopier. Der er ingen måde at verificere, hvad en fjernservice gør med teksten, når den ankommer. Den eneste pålidelige afbødning er at holde diff'en lokal, hvilket betyder at køre den i et værktøj, der aldrig sender teksten over netværket.

Praktiske anvendelser af en lokal diff
Diff er ikke kun til kodegennemgang. Et par almindelige tilfælde, hvor en lokal diff er nyttig: Gennemgang af redigeringer af et dokument eller en konfigurationsfil inden commit. Sammenligning af to versioner af en Dockerfile, en Nginx-konfiguration eller et Kubernetes-manifest for at forstå præcis, hvad der ændrede sig mellem implementeringer. Kontrol af konfigurationsdrift mellem miljøer. Hvis produktion- og staging-konfigurationer formodes at være identiske bortset fra værtsnavne og hemmeligheder, viser en diff øjeblikkeligt enhver utilsigtet afvigelse. Sammenligning af API-svar under fejlfinding. Indsætning af to JSON-nyttelaster fra et REST- eller GraphQL-API og kørsel af en ordniveau-diff identificerer tilføjede felter, ændrede værdier eller fjernede nøgler uden manuelt at læse gennem hundredvis af linjer. Gennemgang af LLM-genereret kode mod en basislinje. Når en model omskriver en funktion, viser en linjeniveaudiff, hvilken logik der ændrede sig og hvilken der forblev den samme, hurtigere end at læse begge versioner uafhængigt. I alle disse tilfælde kan den involverede tekst være følsom, og at holde den væk fra en fjernserver er det enkle valg.
Gør det i browseren uden at uploade
Værktøjet text-diff på dette websted kører hele diff-beregningen i din browser med JavaScript. Du indsætter to tekster i de to paneler, og diff'en gengives øjeblikkeligt, linje for linje, op til 3000 linjer per side. Intet sendes til en server. Teksten forlader aldrig din enhed. Implementeringen bruger en standard LCS-baseret algoritme, der arbejder på linjer: hver linje er et token, og værktøjet regner ud, om den er uændret, tilføjet eller fjernet, ved at finde den længste fælles undersekvens mellem de to versioner. Uændrede linjer vises uden fremhævning, tilføjede linjer i grønt og fjernede linjer i rødt, ved siden af en løbende optælling af tilføjelser og sletninger. Der findes i dag ingen ord- eller tegnbaseret tilstand og ingen skifter til normalisering af blanktegn, så en linje, der kun adskiller sig ved efterstillede blanktegn eller linjeafslutningsstil, vises stadig som ændret. Fordi beregningen kører client-side, fungerer det offline. Der er ingen konto, ingen historik, ingen opbevaring. Du kan sammenligne en lokal konfigurationsfil med en skabelon, gennemgå en patch inden anvendelse eller kontrollere to API-svar uden at nogen af de tekster når en tredjepart.
Værktøjer i denne artikel
Ofte stillede spørgsmål
Er linjebaseret diff eller ordbaseret diff bedst til kode?
For de fleste kodegennemgangsopgaver er linjebaseret diff standarden og den nemmeste at læse, fordi kode er struktureret efter linjer. Ordbaseret diff kan være nyttig, når linjer er lange og kun en lille del ændrede sig, som i en enkelt-linje JSON-værdi, men dette værktøj sammenligner kun på linjeniveau; i det tilfælde kan du bruge den fremhævede linje som en pegepind og selv få øje på den mindre forskel i den.
Hvorfor udgør online diff-værktøjer en privatlivsrisiko, selv om de bruger HTTPS?
HTTPS beskytter teksten under transport mod aflytning, men det beskytter den ikke, når den når serveren. Tjenesteudbyderne har fuld adgang til det indsatte indhold og kan logge, lagre eller dele det. TLS handler om transportsikkerhed, ikke om hvad modtageren gør med dataene.
Gemmer text-diff-værktøjet nogen historik over tidligere sammenligninger?
Nej. Værktøjet har ingen backend og foretager ingen netværksanmodninger. Når du lukker eller genindlæser fanen, er teksten væk. Der er ingen konto, ingen gemt historik og ingen serverside-log.