Diff Checker

Diff Checker

เปรียบเทียบข้อความหรือโค้ดสองชุดพร้อมไฮไลต์ระดับบรรทัดและคำ แบบเคียงข้างหรือ unified ละเว้นช่องว่างและตัวพิมพ์ใหญ่-เล็ก ทำงานในเบราว์เซอร์ของคุณทั้งหมด

ไม่ครับ เครื่องมือทั้งหมดเป็น JavaScript ที่ทำงานอยู่ในหน้านี้ อัลกอริทึม diff (longest-common-subsequence) ทำงานบน CPU ของคุณและผลลัพธ์ถูกเรนเดอร์ตรงเข้าสู่ DOM ลองเปิด DevTools → Network ดูได้ — ไม่มีคำขอใด ๆ ขณะทำ diff ปลอดภัยที่จะวางโค้ดภายใน ข้อมูลลูกค้า ร่างสัญญา หรืออะไรก็ตามที่คุณไม่อยากให้เครื่องมือบนเซิร์ฟเวอร์บันทึกไว้

ก่อนอื่นเราแยกอินพุตทั้งสองออกเป็นบรรทัดแล้วรันอัลกอริทึม LCS (longest common subsequence) บรรทัดที่ตรงกันทั้งสองฝั่งจะถูกทำเครื่องหมายว่าเท่ากัน บรรทัดที่ไม่ตรงกันจะถูกจับคู่เป็นแถว 'change' เมื่อมีการเพิ่มอยู่ติดกับการลบ สำหรับแต่ละคู่การเปลี่ยนแปลง เราจะรัน LCS อีกครั้งบนคำในบรรทัด (แยกด้วยช่องว่าง) เพื่อให้เฉพาะคำที่แก้ไขจริงเท่านั้นที่สว่างเป็นสีแดง/เขียว — ไม่ใช่ทั้งบรรทัด

ทำไมต้องใช้ iKit Diff Checker

พื้นที่ทดลอง diff ข้อความที่สะอาด รวดเร็ว ปราศจากโฆษณา ป๊อปอัป หรือตัวติดตามจากบุคคลที่สาม สร้างมาเพื่อนักพัฒนา นักเขียน และทุกคนที่ต้องการเห็นว่ามีอะไรเปลี่ยนไปบ้าง

มุมมองเคียงข้าง + unified

สลับระหว่างมุมมองแบบแยกคอลัมน์ (สองคอลัมน์ ความรู้สึกแบบ IDE คลาสสิก) และ unified (คอลัมน์เดียวพร้อมเครื่องหมาย +/−) ได้ด้วยคลิกเดียว ทั้งสองมุมมองแสดงหมายเลขบรรทัดและไฮไลต์ทุกการเปลี่ยนแปลงในตัว

ไฮไลต์ระดับคำ

เมื่อสองบรรทัดมีการเปลี่ยนแปลง เราจะรัน diff ระดับคำอีกชั้นหนึ่ง เพื่อให้เฉพาะส่วนที่ต่างกันจริงเท่านั้นที่สว่างขึ้น ไม่ใช่ทั้งบรรทัด ทำให้หาคำผิดเพียงคำเดียวในบรรทัดยาว 200 ตัวอักษรได้ง่ายขึ้น

ละเว้นช่องว่าง + ละเว้นตัวพิมพ์

เปิดปิดความไวต่อช่องว่างและตัวพิมพ์ใหญ่-เล็ก เพื่อกรองการเปลี่ยนแปลงเชิงรูปลักษณ์ออกไป (การจัดย่อหน้าใหม่ การปรับตัวพิมพ์) แล้วโฟกัสที่การแก้ไขที่แท้จริง

ออกแบบมาเพื่อความเป็นส่วนตัว

ข้อความทั้งสองอยู่ในแท็บเบราว์เซอร์ของคุณ อัลกอริทึม diff ทำงานในเครื่องด้วย JavaScript ตรวจสอบได้ใน DevTools → Network: ไม่มีคำขอเครือข่ายใด ๆ ขณะที่คุณพิมพ์

สถิติ + คัดลอก

ดูได้ทันทีว่ามีกี่บรรทัดที่เพิ่ม ลบ และแก้ไข คลิกเดียวเพื่อคัดลอก diff ไปยังคลิปบอร์ดสำหรับวางใน code review หรือข้อความ commit

ใช้งานได้แบบออฟไลน์

หลังจากโหลดหน้าแล้ว ทุกไบต์ถูกคำนวณในเครื่อง ใช้งานได้บนเครื่องบิน หลังไฟร์วอลล์องค์กร หรือไม่มีเครือข่ายเลย เหมาะสำหรับ code review ที่เป็นความลับ

diff checker ทำงานอย่างไรกันแน่

คณิตศาสตร์เบื้องหลังเก่ากว่าเว็บเสียอีก เป็นอัลกอริทึมจากปี 1965 ชื่อ LCS บวกกับการปรับปรุงในปี 1986 โดย Eugene Myers

  1. 1

    แยกออกเป็นบรรทัด

    อินพุตทั้งสองจะถูกตัดที่ \n (หรือ \r\n) แต่ละบรรทัดกลายเป็นโทเคน เราเปรียบเทียบโทเคน ไม่ใช่ตัวอักษร เพราะการแก้ไขส่วนใหญ่ในโค้ดหรือเอกสารในโลกจริงคือการเพิ่ม ลบ หรือแก้ไขทั้งบรรทัด

  2. 2

    คำนวณ LCS

    Longest Common Subsequence คือชุดบรรทัดที่ใหญ่ที่สุดซึ่งปรากฏในลำดับเดียวกันในอินพุตทั้งสอง เราเติมตาราง DP จากมุมขวาล่างขึ้นไป แต่ละเซลล์เก็บความยาว LCS จากตำแหน่งนั้นถึงปลาย ใช้เวลาและหน่วยความจำ O(m × n)

  3. 3

    ย้อนกลับเพื่อสรุปการดำเนินการ

    เริ่มจากมุมซ้ายบนของตาราง เราเดินไปข้างหน้า: ถ้าสองบรรทัดปัจจุบันตรงกัน ให้ส่งออก equal มิฉะนั้นเลือกทิศทาง (ขวาหรือลง) ที่รักษาความยาว LCS ไว้ แล้วส่งออก delete หรือ insert ผลลัพธ์คือลำดับการดำเนินการที่เปลี่ยนต้นฉบับให้กลายเป็นฉบับแก้ไข

  4. 4

    diff ระดับคำในคู่ที่เปลี่ยนแปลง

    เมื่อ delete ตามด้วย insert เราจะจับคู่กันเป็นแถว change เพื่อไฮไลต์เฉพาะส่วนที่ต่างภายในบรรทัด เราจะรันอัลกอริทึม LCS เดียวกันอีกรอบบนคำของแต่ละฝั่ง โดยแยกที่ขอบของช่องว่าง

งาน diff ที่พบบ่อย

สถานการณ์จริงที่คุณจะหยิบ diff checker มาใช้

รีวิว PR ก่อนคอมเมนต์

มุมมอง diff ของ GitHub นั้นยอดเยี่ยม แต่บางครั้งคุณอยากเห็น เฉพาะ การเปลี่ยนแปลงที่เป็นเนื้อหาจริง ๆ โดยไม่มีสัญญาณรบกวนจาก formatter วางทั้งสองเวอร์ชัน เปิด 'ละเว้นช่องว่าง' การจัดรูปแบบเชิงรูปลักษณ์จะหายไป เหลือเพียงการแก้ไขเชิงตรรกะ

เปรียบเทียบร่างสัญญาสองฉบับ

ทนายและทีมปฏิบัติการมักต้องรู้ว่ามีอะไรเปลี่ยนระหว่าง v1 และ v2 ของสัญญา วางทั้งสอง รับ diff ที่ระบายสีพร้อมไฮไลต์ระดับคำ — ไม่ต้องใช้ Word ไม่ต้อง Track Changes ไม่ต้องอัปโหลดข้อความที่เป็นความลับไปยังเซิร์ฟเวอร์ของบุคคลที่สาม

ตรวจดูว่าสคริปต์แก้ไขอะไรไปจริง ๆ

รัน sed/awk/Python regex บนไฟล์คอนฟิกหรือเปล่า? วางต้นฉบับและผลลัพธ์ที่นี่เพื่อยืนยันว่าสคริปต์แก้ไขเฉพาะที่คุณคาดไว้ ไฮไลต์ระดับตัวอักษรจะจับการแก้ไขที่หลุดสายตาในการสแกนแบบเร็ว ๆ ได้

หาคำผิดในข้อความที่แปลแล้ว

คู่การแปล (ต้นฉบับเทียบคำแปล หรือคำแปลสองชุดของต้นฉบับเดียวกัน) — diff ระดับคำทำให้หาคำที่ขาดหาย วลีที่ซ้ำ หรือเครื่องหมายวรรคตอนสลับที่ผู้พิสูจน์อักษรพลาดไปได้อย่างง่ายดาย

ทำไมการทำ diff ในเครื่องจึงสำคัญ

ข้อความที่คุณเปรียบเทียบมักเป็น ส่วนตัว: โค้ดจาก repo ภายใน ร่างสัญญา ข้อมูลลูกค้าที่ส่งออก หรือเนื้อหาผลิตภัณฑ์ที่ยังไม่เปิดตัว การวางลงในเซิร์ฟเวอร์ของคนแปลกหน้าสร้างร่องรอยที่คุณควบคุมไม่ได้ Diff checker ของ iKit เป็น JavaScript ที่โหลดอยู่ในแท็บเบราว์เซอร์ของคุณแล้ว — การเปรียบเทียบรันบน CPU ของคุณและไม่เคยแตะซ็อกเก็ตเครือข่าย

  • ไม่มีคำขอเครือข่ายขณะทำ diff — ตรวจสอบได้ใน DevTools → Network
  • อินพุตอยู่ในหน่วยความจำเบราว์เซอร์ ล้างเมื่อกด Clear หรือรีเฟรชหน้า
  • ปลอดภัยสำหรับโค้ดภายใน เอกสารที่อยู่ภายใต้ NDA บันทึกฝ่ายสนับสนุนลูกค้า และอะไรก็ตามที่อยู่ภายใต้นโยบายถิ่นที่อยู่ของข้อมูล

Related guides

Deep-dive tutorials and tool comparisons from the iKit blog.

คำถามที่พบบ่อย

ปลอดภัยไหม ข้อความของฉันถูกอัปโหลดหรือเปล่า?

ไม่ครับ เครื่องมือทั้งหมดเป็น JavaScript ที่ทำงานอยู่ในหน้านี้ อัลกอริทึม diff (longest-common-subsequence) ทำงานบน CPU ของคุณและผลลัพธ์ถูกเรนเดอร์ตรงเข้าสู่ DOM ลองเปิด DevTools → Network ดูได้ — ไม่มีคำขอใด ๆ ขณะทำ diff ปลอดภัยที่จะวางโค้ดภายใน ข้อมูลลูกค้า ร่างสัญญา หรืออะไรก็ตามที่คุณไม่อยากให้เครื่องมือบนเซิร์ฟเวอร์บันทึกไว้

การไฮไลต์ระดับบรรทัด + คำทำงานอย่างไร?

ก่อนอื่นเราแยกอินพุตทั้งสองออกเป็นบรรทัดแล้วรันอัลกอริทึม LCS (longest common subsequence) บรรทัดที่ตรงกันทั้งสองฝั่งจะถูกทำเครื่องหมายว่าเท่ากัน บรรทัดที่ไม่ตรงกันจะถูกจับคู่เป็นแถว 'change' เมื่อมีการเพิ่มอยู่ติดกับการลบ สำหรับแต่ละคู่การเปลี่ยนแปลง เราจะรัน LCS อีกครั้งบนคำในบรรทัด (แยกด้วยช่องว่าง) เพื่อให้เฉพาะคำที่แก้ไขจริงเท่านั้นที่สว่างเป็นสีแดง/เขียว — ไม่ใช่ทั้งบรรทัด

มุมมองแบบ Split กับ Unified ต่างกันอย่างไร?

มุมมองแบบ Split แสดงข้อความทั้งสองเคียงข้างกันพร้อมหมายเลขบรรทัดที่จับคู่กัน ใกล้เคียงกับ diff ใน IDE (VS Code, JetBrains) ส่วนมุมมอง Unified แสดงคอลัมน์เดียวโดยมีบรรทัดนำหน้าด้วย +/− ใกล้เคียงกับสิ่งที่ `git diff` พิมพ์ออกมา เลือกแบบที่เข้ากับเวิร์กโฟลว์ของคุณ ทั้งสองแสดงข้อมูลเดียวกัน

ทำไม 'ละเว้นช่องว่าง' จึงช่วยได้?

การจัดรูปแบบโค้ดใหม่ (รัน Prettier, สลับ tab/space, ปรับตัวจบบรรทัด) ทำให้เกิดสัญญาณรบกวนทางสายตาที่กลบการเปลี่ยนแปลงจริง การเปิด 'ละเว้นช่องว่าง' จะยุบช่องว่าง/แท็บที่ต่อเนื่องกันให้เหลือช่องว่างเดียวและตัดขอบบรรทัดก่อนทำ diff คุณจึงเห็นเฉพาะการแก้ไขที่มีความหมาย ไม่ใช่การปรับแต่งเชิงรูปลักษณ์

อินพุตที่ใหญ่ที่สุดที่ทำ diff ในเบราว์เซอร์ได้มีขนาดเท่าไร?

อัลกอริทึม LCS ใช้หน่วยความจำ O(m × n) โดย m และ n คือจำนวนบรรทัดในแต่ละฝั่ง iKit จำกัดการเปรียบเทียบไว้ที่ราว 4 ล้านเซลล์ (ประมาณ 16 MB) ซึ่งรองรับได้สบาย ๆ ถึงระดับหลายพันบรรทัดต่อหลายพันบรรทัด สำหรับ diff ที่ใหญ่กว่านั้น (ดัมป์ฐานข้อมูลทั้งก้อน บันทึกไฟล์เต็ม) ให้ใช้เครื่องมือ CLI อย่าง `diff` หรือ `git diff --no-index` ซึ่งใช้อัลกอริทึมที่ฉลาดกว่า (Myers diff) ที่ขยายไปถึงล้านบรรทัดได้