Artikel
Jämför kodfragment utan att ladda upp dem
Varje gång du klistrar in två filer i ett online-diff-verktyg lämnar den koden din maskin. Konfigurationsfiler, databasfrågor, API-nycklar begravda i ett .env-fragment: allt reser till en server du inte kontrollerar. Den här artikeln tar upp hur diff-algoritmer fungerar, vad granularitetsalternativ innebär i praktiken och varför det spelar roll att hålla jämförelsen lokal.
Vad en diff beräknar
Ett diff-verktyg tar två texter och hittar den minimala uppsättningen ändringar som konverterar den ena till den andra. Kärnidén är den längsta gemensamma delsekvensen, eller LCS: den längsta sekvensen av rader (eller tokens) som förekommer i båda texterna i samma ordning, även om de inte är angränsande. Allt som inte finns i den gemensamma delsekvensen är antingen ett tillägg i den nya versionen eller en borttagning från den gamla. Den klassiska algoritmen för detta är från Myers (1986), som hittar det kortaste redigeringsskriptet på O((N+M)D) tid, där N och M är längderna på de två texterna och D är antalet redigeringar. I praktiken lägger de flesta verktyg till ett förbehandlingssteg för att ignorera gemensamma inledande rader och gemensamma avslutande rader, vilket reducerar problemet till det ändrade området. Resultatet är en patch: en sekvens av block, vart och ett som beskriver ett sammanhängande block av kontextrader, borttagningar och tillägg. Detta är formatet som används av Unix diff, Git och de flesta kodgranskningsverktyg.

Rad-, ord- och teckengranularitet
Granulariteten hos en diff avgör vad som räknas som en jämförelseenhet. Radbaserad diff är standard i de flesta verktyg: varje rad behandlas som en enda token. Detta är snabbt och producerar utdata som är lätt att läsa i sammanhanget, men markerar en hel rad som ändrad även om bara ett ord på den raden skiljer sig. Ord-nivå-diff delar varje rad i ord innan LCS körs. Detta ger en finare bild av vad som ändrades inom en rad, vilket är användbart för prosa, konfigurationsvärden eller JSON. Tecken-nivå-diff går längre och kan markera en enda ändrad bokstav inuti en lång identifierare. Blankstegshantering lägger till brus. En rad som slutar med CRLF och samma rad som slutar med LF visas som olika under en strikt bytesjämförelse. De flesta verktyg erbjuder en flagga för att normalisera radbrytningar före diffning. På liknande sätt kan efterföljande blanksteg, taabb-kontra-blanksteg-indragning och tomma rader alla producera falska diff-utdata. Att aktivera blankstegsnormalisering är vanligtvis rätt standard när man jämför kod från olika redigerare eller operativsystem.
Integritetsrisken med online-diff-verktyg
Online-diff- och pastebin-tjänster är praktiska: öppna en URL, klistra in två fragment, få en färgad utdata. Problemet är att texten du klistrar in överförs till en tredjepartsserver. Beroende på tjänsten kan den texten loggas, indexeras, lagras på obestämd tid eller delas med analysleverantörer. Detta spelar störst roll när koden innehåller känsligt material. Hårdkodade autentiseringsuppgifter, interna värdnamn, proprietär affärslogik eller personuppgifter kan alla hamna i en inklistrad text. Även utan explicita hemligheter kan strukturen hos intern kod avslöja arkitekturbeslut du föredrar att hålla privata. Risken är inte hypotetisk. Säkerhetsforskare har upprepade gånger hittat autentiseringsuppgifter och interna tokens i offentliga inklistrade texter. Vissa tjänster behåller inklistrade texter även efter att en användare raderat dem, eftersom kopior finns i cacher eller säkerhetskopior. Det finns inget sätt att verifiera vad en fjärrtjänst gör med texten när den väl anlänt. Den enda tillförlitliga begränsningen är att hålla diff:en lokal, vilket innebär att köra den i ett verktyg som aldrig skickar texten över nätverket.

Praktisk användning för en lokal diff
Diff är inte bara för kodgranskning. Några vanliga fall där en lokal diff är användbar: Granska redigeringar av ett dokument eller en konfigurationsfil innan incheckande. Jämföra två versioner av en Dockerfile, en Nginx-konfiguration eller ett Kubernetes-manifest för att exakt förstå vad som ändrades mellan driftsättningar. Kontrollera konfigurationsavdrift mellan miljöer. Om produktions- och staging-konfigurationer ska vara identiska utom för värdnamn och hemligheter visar en diff omedelbart oavsiktliga avvikelser. Jämföra API-svar vid felsökning. Att klistra in två JSON-nyttolaster från ett REST- eller GraphQL-API och köra en ord-nivå-diff pekar ut tillagda fält, ändrade värden eller borttagna nycklar utan att manuellt läsa igenom hundratals rader. Granska LLM-genererad kod mot en baslinje. När en modell skriver om en funktion visar en rad-nivå-diff vilken logik som ändrades och vilken som förblev densamma, snabbare än att läsa båda versionerna oberoende. I alla dessa fall kan den inblandade texten vara känslig, och att hålla den borta från en fjärrserver är det enkla valet.
Gör det i webbläsaren, utan uppladdning
Verktyget text-diff på den här webbplatsen kör hela diff-beräkningen i din webbläsare med JavaScript. Du klistrar in två texter i de två panelerna och diff:en renderas omedelbart, rad för rad, upp till 3000 rader per sida. Inget skickas till en server. Texten lämnar aldrig din enhet. Implementationen använder en standard LCS-baserad algoritm som arbetar på rader: varje rad är en token, och verktyget avgör om den är oförändrad, tillagd eller borttagen genom att hitta den längsta gemensamma delsekvensen mellan de två versionerna. Oförändrade rader visas utan markering, tillagda rader i grönt, borttagna rader i rött, bredvid en löpande räknare för tillägg och borttagningar. Det finns inget ord- eller teckenbaserat läge och ingen växel för blankstegsnormalisering i dagsläget, så en rad som bara skiljer sig i avslutande blanksteg eller radslutsstil visas ändå som ändrad. Eftersom beräkningen körs på klientsidan fungerar det offline. Det finns inget konto, ingen historik, ingen lagring. Du kan jämföra en lokal konfigurationsfil mot en mall, granska en patch innan du tillämpar den, eller kontrollera två API-svar utan att någon av den texten når en tredje part.
Verktyg i den här artikeln
Vanliga frågor
Är radbaserad diff eller ordbaserad diff bättre för kod?
För de flesta kodgranskningsuppgifter är radbaserad diff standard och lättast att läsa, eftersom kod är strukturerad efter rader. Ordbaserad diff kan hjälpa när rader är långa och bara en liten del ändrades, till exempel i ett JSON-värde på en rad, men det här verktyget jämför bara på radnivå; använd i så fall den markerade raden som en pekare och avgör den mindre skillnaden inom den med ögonmått.
Varför utgör online-diff-verktyg en integritetsrisk även om de använder HTTPS?
HTTPS skyddar texten under transport från avlyssning, men skyddar den inte när den når servern. Tjänstoperatören har full tillgång till det inklistrade innehållet och kan logga, lagra eller dela det. TLS handlar om transportsäkerhet, inte om vad mottagaren gör med data.
Lagrar text-diff-verktyget någon historik över tidigare jämförelser?
Nej. Verktyget har ingen backend och gör inga nätverksbegäranden. När du stänger eller laddar om fliken är texten borta. Det finns inget konto, ingen sparad historik och ingen serversidig logg.