Công cụ so sánh văn bản

So sánh văn bản — Diff Checker

Dán văn bản gốc và văn bản mới → So sánh → Xem từng dòng thêm vào, xóa đi và không đổi. Miễn phí, tức thì, riêng tư.

Tức thìRiêng tưMiễn phíThuật toán LCS
Văn bản gốc (Original)
Văn bản mới (Modified)
Ctrl+Enter để so sánh nhanh
Dán văn bản vào hai ô trên và nhấn So sánh

Tải ví dụ mẫu

Thay đổi đơn giản
Nhấn để tải vào trình so sánh
Chỉnh sửa nhiều dòng
Nhấn để tải vào trình so sánh
Chỉ khoảng trắng
Nhấn để tải vào trình so sánh

Ý nghĩa các ký hiệu Diff

+
Dòng thêm vào
Có trong Modified, không có trong Original
Dòng bị xóa
Có trong Original, không có trong Modified
·
Dòng không đổi
Giống nhau ở cả hai phiên bản

Khi nào dùng Diff Checker?

Review code
So sánh code trước/sau thay đổi, phát hiện regression, review pull request ngoại tuyến.
So sánh tài liệu
So sánh hai phiên bản hợp đồng, báo cáo hoặc tài liệu kỹ thuật để tìm thay đổi chính xác.
Debug cấu hình
Tìm sự khác biệt giữa hai file cấu hình, biến môi trường hoặc JSON payload.

Công cụ so sánh văn bản là gì?

Diff Checker (hay còn gọi là công cụ so sánh văn bản) là phần mềm phân tích hai đoạn văn bản và tìm ra sự khác biệt giữa chúng ở mức dòng. Kết quả hiển thị các dòng thêm vào (+), dòng bị xóa () và dòng không thay đổi, giúp bạn nhanh chóng nhận diện những gì đã thay đổi mà không cần đọc lại toàn bộ văn bản.

Công cụ này đặc biệt hữu ích trong phát triển phần mềm khi lập trình viên cần so sánh hai phiên bản của cùng một file code. Tuy nhiên, ứng dụng rộng hơn nhiều: so sánh hợp đồng pháp lý, kiểm tra thay đổi trong tài liệu kỹ thuật, debug file cấu hình hoặc phát hiện các thay đổi ngoài ý muốn trước khi triển khai.

Thuật toán so sánh hoạt động như thế nào

ZestLab Diff Checker sử dụng thuật toán LCS (Longest Common Subsequence) — thuật toán tìm chuỗi con chung dài nhất giữa hai văn bản. Đây là nền tảng của hầu hết các công cụ diff hiện đại, bao gồm cả Git.

Thuật toán hoạt động theo hai giai đoạn:

  • Giai đoạn 1 — Xây dựng bảng LCS: Chia cả hai văn bản thành mảng các dòng. Dùng quy hoạch động (DP) xây dựng bảng dp[i][j] — độ dài của chuỗi con chung giữa i dòng đầu của văn bản gốc và j dòng đầu của văn bản mới. Độ phức tạp: O(m × n).
  • Giai đoạn 2 — Truy vết ngược: Từ dp[m][n], truy vết ngược để xác định từng dòng là "giữ nguyên", "thêm vào" hay "bị xóa".

So với thuật toán Myers diff (được Git dùng), LCS đơn giản hơn nhưng đủ hiệu quả cho các văn bản ngắn đến trung bình. Với file rất lớn (>10.000 dòng), Myers diff nhanh hơn nhờ tối ưu độ phức tạp xuống O(n × d) với d là số lượng khác biệt.

So sánh song song vs hợp nhất (Unified Diff)

Có hai cách hiển thị kết quả diff phổ biến:

Tiêu chíSide-by-Side (Song song)Unified Diff (Hợp nhất)
Cách bố tríHai cột, mỗi cột là một phiên bảnMột cột, xen kẽ dòng cũ/mới
Phù hợp vớiFile lớn, nhiều thay đổi phân tánFile nhỏ, thay đổi tập trung
Dùng bởiIDE (VS Code, JetBrains)Git CLI, patch files
Điểm mạnhNhìn tổng quan cả hai phiên bảnCompact, dễ copy sang terminal

ZestLab Diff Checker hiển thị unified diff với số dòng từ cả hai phía — cách tiếp cận cân bằng giữa hai phong cách. Bạn vừa thấy được số dòng gốc và số dòng mới, vừa không cần scroll ngang nhiều.

So sánh diff cho review code

Trong quy trình review code, diff là thông tin quan trọng nhất. Thay vì đọc toàn bộ file, reviewer chỉ cần nhìn vào diff để hiểu thay đổi. Một số nguyên tắc để diff dễ review hơn:

  • Commit nhỏ, một mục đích: Mỗi commit chỉ làm một việc — refactor HOẶC thêm feature HOẶC fix bug. Không trộn lẫn.
  • Tránh reformatting cùng lúc: Thay đổi format code (thụt lề, trailing comma) tạo ra diff khổng lồ che khuất thay đổi thực. Tách thành commit riêng.
  • Đặt tên biến có nghĩa trước khi review: Rename biến cũng tạo diff lớn — làm điều này trước, không để cùng lúc với logic changes.
  • Thêm context: PR description nên giải thích "tại sao" thay đổi, không chỉ "là gì". Diff cho biết "là gì", con người cần biết "tại sao".

Lỗi thường gặp khi dùng diff

1. Nhầm lẫn encoding

Cùng một ký tự nhưng file A lưu UTF-8, file B lưu UTF-16 → diff sẽ báo mọi dòng đều khác nhau dù nội dung giống hệt. Giải pháp: luôn chuyển sang UTF-8 trước khi diff.

2. Khoảng trắng vô hình (trailing whitespace)

Dòng có "hello " (thêm space) trông giống "hello" trong editor nhưng diff sẽ đánh dấu khác nhau. Bật "Ignore whitespace" nếu bạn chỉ quan tâm đến nội dung thực sự thay đổi.

3. Line ending khác nhau (CRLF vs LF)

Windows dùng \r\n, Linux/macOS dùng \n. Khi file mở trên hệ điều hành khác nhau và lưu lại, line ending thay đổi → diff toàn bộ file. Cấu hình .gitattributes để chuẩn hóa line ending trong dự án.

4. So sánh file nhị phân bằng text diff

Text diff không có ý nghĩa với file nhị phân (PDF, ảnh, Word). Kết quả sẽ là noise không đọc được. Với binary file, dùng checksum (MD5/SHA256) để kiểm tra nhanh xem có thay đổi không.

Câu hỏi thường gặp

Giới thiệu về Developer Tools

Công cụ developer tự động hóa các phần lặp đi lặp lại của công việc phần mềm: format JSON, encode/decode Base64, decode JWT để xác minh claim của token, tạo UUID, format XML, diff cấu hình. Đây không phải tác vụ hào nhoáng, nhưng là các điểm nghẽn ngốn 10-15 phút nhiều lần mỗi ngày — cộng lại hàng giờ mỗi tuần. Chạy chúng trên tab trình duyệt sạch sẽ hơn vật lộn với phụ thuộc CLI hay extension IDE có thể gửi dữ liệu riêng tư của bạn cho bên thứ ba.

Vì sao nó quan trọng

Công cụ developer client-side nhanh về cơ bản quan trọng vì chúng được dùng với dữ liệu nhạy cảm. JWT token chứa danh tính người dùng. Payload Base64 có thể encode API key. JSON dump bao gồm bản ghi khách hàng. Nếu một 'công cụ developer' gửi input của bạn lên server để xử lý, bạn vừa rò rỉ production secret. Công cụ dev của ZestLab chạy 100% client-side không có network call nào sau khi load page — những gì bạn paste vẫn ở trong trình duyệt.

Riêng tư và an toàn

Tất cả công cụ developer ở đây chạy trong trình duyệt bằng JavaScript thuần. Không có 'decode server' hay 'format API' — JWT, JSON, payload encode của bạn được parse bởi code chạy trên laptop của bạn. Tự xác minh bằng DevTools trình duyệt → Network tab: bạn sẽ thấy không có request nào khi dùng bất kỳ công cụ nào. Đó là tiêu chuẩn chúng tôi giữ vì công cụ dev xử lý secret.

Thực hành tốt

  • Không bao giờ paste JWT hay API token production vào BẤT KỲ công cụ online nào mà không xác minh chạy client-side (check tab Network)
  • Dùng chế độ ẩn danh trình duyệt để decode một lần các payload nhạy cảm
  • Bookmark công cụ bạn dùng hàng ngày — URL công cụ ZestLab ổn định, không cần tài khoản
  • Khi format JSON có secret để team review, redact credential trước khi share output