無需上傳, 100% 本機處理, 無需帳戶

文章

在不上傳的情況下比較程式碼片段

每次您將兩個檔案貼入線上 diff 工具,那些程式碼就離開了您的機器。設定檔、資料庫查詢、埋在 .env 片段中的 API 金鑰:所有這些都傳送到了您無法控制的伺服器。本文介紹 diff 演算法的工作原理、粒度選項在實踐中的含義,以及為什麼將比較保持在本地很重要。

Diff 計算的是什麼

diff 工具接收兩段文字,找出將一個轉換為另一個所需的最小變更集合。核心概念是最長公共子序列(LCS):出現在兩段文字中、以相同順序排列的最長行序列(或標記序列),即使它們不相鄰。不在公共子序列中的所有內容,要麼是新版本中的新增,要麼是舊版本中的刪除。 這方面的經典演算法由 Myers(1986 年)提出,能在 O((N+M)D) 時間內找到最短編輯腳本,其中 N 和 M 是兩段文字的長度,D 是編輯次數。在實踐中,大多數工具會添加預處理步驟來忽略開頭和結尾的公共行,將問題縮減到發生變更的區域。 結果是一個補丁:一系列的變更塊,每個變更塊描述一個連續的上下文行、刪除和新增的區塊。這是 Unix diff、Git 和大多數程式碼審查工具使用的格式。

圖表顯示兩個文字輸入通過其最長公共子序列對齊,相符的行用連線連接,不同的行標記為新增或刪除

行、詞和字元粒度

diff 的粒度決定了什麼算作一個比較單位。基於行的 diff 是大多數工具的預設值:每行被視為單一標記。這很快速,且產生的輸出在上下文中易於閱讀,但即使一行中只有一個詞改變,整行也會被標記為已更改。 詞級 diff 在執行 LCS 前將每行拆分為詞。這對一行內的變更提供了更精細的圖像,對於散文、設定值或 JSON 很有用。字元級 diff 更進一步,可以高亮顯示長識別符中單個被更改的字母。 空白字元處理會增加雜訊。以 CRLF 結尾的行和以 LF 結尾的相同行在嚴格的位元組比較下會顯示為不同。大多數工具提供一個選項,在比較前標準化行尾符號。同樣,尾部空格、定位字元與空格的縮排差異,以及空行,都可能產生多餘的 diff 輸出。在比較來自不同編輯器或作業系統的程式碼時,啟用空白字元標準化通常是正確的預設值。

線上 diff 工具的隱私風險

線上 diff 和貼文服務很方便:打開 URL、貼入兩個片段、獲得彩色輸出。問題是您貼入的文字會傳送到第三方伺服器。根據服務的不同,該文字可能被記錄、索引、無限期儲存,或與分析提供商分享。 當程式碼包含敏感材料時,這一點尤為重要。硬編碼的憑證、內部主機名稱、專有業務邏輯或個人可識別資料都可能出現在貼文中。即使沒有明確的機密,內部程式碼的結構也可能洩露您希望保密的架構決策。 這種風險並非假設性的。安全研究人員多次在公開貼文中發現憑證和內部令牌。一些服務即使在用戶刪除後仍保留貼文,因為副本存在於快取或備份中。無法驗證遠端服務在接收到文字後會如何處理它。 唯一可靠的緩解措施是將 diff 保持在本地,這意味著在一個從不透過網路傳送文字的工具中執行它。

瀏覽器網路面板的截圖,顯示在 text-diff 工具中比較兩個程式碼片段時,沒有任何傳出請求

本地 diff 的實際用途

Diff 不只用於程式碼審查。一些本地 diff 有用的常見情況: 在提交前審查對文件或設定檔的編輯。比較 Dockerfile、Nginx 設定或 Kubernetes 清單的兩個版本,以確切了解部署之間發生了什麼變化。 檢查環境之間的設定漂移。如果生產和預備環境的設定除了主機名稱和機密之外應該相同,diff 可以立即顯示任何非預期的差異。 在除錯期間比較 API 回應。將來自 REST 或 GraphQL API 的兩個 JSON 有效載荷貼入並執行詞級 diff,可以精確定位新增的欄位、更改的值或刪除的鍵,而無需手動閱讀數百行。 審查 LLM 生成的程式碼與基準的比較。當模型重寫一個函式時,行級 diff 可以顯示哪些邏輯發生了變化,哪些保持不變,比獨立閱讀兩個版本更快。 在所有這些情況下,涉及的文字可能是敏感的,將其保留在遠端伺服器之外是顯而易見的選擇。

在瀏覽器中完成,無需上傳

本網站的 text-diff 工具使用 JavaScript 完全在您的瀏覽器中執行整個 diff 計算。您將兩段文字貼入兩個面板,diff 結果會立即逐行呈現,每側最多支援 3000 行。沒有任何內容傳送到伺服器。文字從不離開您的裝置。 實作使用基於 LCS 的標準演算法,以行為單位運作:每一行是一個標記,工具透過在兩個版本之間尋找最長共同子序列,判斷每一行是未變更、新增還是移除。未變更的行不加任何標示,新增的行以綠色顯示,移除的行以紅色顯示,旁邊會顯示新增與刪除的即時計數。目前沒有詞層級或字元層級的模式,也沒有空白字元標準化的切換選項,因此僅有結尾空白或換行風格不同的行,仍會被顯示為已變更。 由於計算在用戶端執行,它可以離線工作。沒有帳戶、沒有歷史記錄、沒有資料保留。您可以比較本地設定檔與模板,在套用補丁前審查它,或檢查兩個 API 回應,而不讓任何文字傳到第三方。

本文涉及的工具

常見問題

對於程式碼,基於行的 diff 還是基於詞的 diff 更好?

對於大多數程式碼審查任務,基於行的 diff 是標準且最易閱讀的,因為程式碼是按行組織的。當行很長且只有一小部分發生變化時,基於詞的 diff 或許會有幫助,例如在單行 JSON 值中;但本工具只能以行為單位比較,遇到這種情況,可以把標示出來的那一行當作指引,再自行用肉眼找出其中較小的差異。

即使線上 diff 工具使用 HTTPS,為什麼仍存在隱私風險?

HTTPS 保護傳輸中的文字不被竊聽,但一旦文字到達伺服器,HTTPS 就無法保護它。服務運營商可以完全存取貼入的內容,可以記錄、儲存或分享它。TLS 關乎傳輸安全,而非接收方如何處理資料。

text-diff 工具會儲存過去比較的歷史記錄嗎?

不會。該工具沒有後端,也不發出任何網路請求。一旦您關閉或重新載入分頁,文字就消失了。沒有帳戶、沒有儲存的歷史記錄、也沒有伺服器端的日誌。