ไม่มีการอัปโหลด, 100% ในเครื่อง, ไม่มีบัญชี

บทความ

เปรียบเทียบโค้ดโดยไม่อัปโหลด

ทุกครั้งที่คุณวางสองไฟล์ลงในเครื่องมือ diff ออนไลน์ โค้ดนั้นออกจากเครื่องของคุณ ไฟล์คอนฟิก คำสั่งฐานข้อมูล คีย์ API ที่ฝังอยู่ใน .env: ทั้งหมดเดินทางไปยังเซิร์ฟเวอร์ที่คุณไม่ได้ควบคุม บทความนี้ครอบคลุมวิธีการทำงานของอัลกอริทึม diff ความหมายของตัวเลือกความละเอียดในทางปฏิบัติ และเหตุผลที่การเก็บการเปรียบเทียบในเครื่องมีความสำคัญ

สิ่งที่ diff คำนวณ

เครื่องมือ diff รับข้อความสองชุดและหาชุดการเปลี่ยนแปลงที่น้อยที่สุดที่แปลงชุดหนึ่งเป็นอีกชุด แนวคิดหลักคือ longest common subsequence หรือ LCS: ลำดับยาวที่สุดของบรรทัด (หรือโทเค็น) ที่ปรากฏในทั้งสองข้อความในลำดับเดียวกัน แม้ว่าจะไม่ติดกัน ทุกอย่างที่ไม่อยู่ใน common subsequence นั้นคือการเพิ่มในเวอร์ชันใหม่หรือการลบจากเวอร์ชันเก่า อัลกอริทึมคลาสสิกสำหรับสิ่งนี้เป็นของ Myers (1986) ซึ่งหา edit script ที่สั้นที่สุดใน O((N+M)D) เวลา โดยที่ N และ M คือความยาวของข้อความสองชุดและ D คือจำนวนการแก้ไข ในทางปฏิบัติ เครื่องมือส่วนใหญ่เพิ่มขั้นตอนการประมวลผลล่วงหน้าเพื่อละเว้นบรรทัดทั่วไปตอนต้นและตอนท้าย ลดปัญหาให้เหลือเฉพาะบริเวณที่เปลี่ยนแปลง ผลลัพธ์คือ patch: ลำดับของ hunk แต่ละอันอธิบายบล็อกต่อเนื่องของบรรทัดบริบท การลบ และการเพิ่ม นี่คือรูปแบบที่ใช้โดย Unix diff, Git และเครื่องมือตรวจสอบโค้ดส่วนใหญ่

แผนภาพแสดง input สองชุดที่จัดเรียงตาม longest common subsequence โดยบรรทัดที่ตรงกันเชื่อมต่อกันและบรรทัดที่ต่างกันทำเครื่องหมายว่าเป็นการเพิ่มหรือการลบ

ความละเอียดระดับบรรทัด คำ และอักขระ

ความละเอียดของ diff กำหนดสิ่งที่นับเป็นหน่วยของการเปรียบเทียบ Diff แบบบรรทัดเป็นค่าเริ่มต้นในเครื่องมือส่วนใหญ่: แต่ละบรรทัดถือเป็นโทเค็นเดียว รวดเร็วและสร้าง output ที่อ่านง่ายในบริบท แต่จะทำเครื่องหมายทั้งบรรทัดว่าเปลี่ยนแปลงแม้ว่าจะเปลี่ยนเพียงคำเดียว Diff ระดับคำแบ่งแต่ละบรรทัดเป็นคำก่อนรัน LCS ให้ภาพที่ละเอียดกว่าของสิ่งที่เปลี่ยนแปลงภายในบรรทัด ซึ่งมีประโยชน์สำหรับร้อยแก้ว ค่าคอนฟิก หรือ JSON Diff ระดับอักขระไปไกลกว่านั้นและสามารถไฮไลต์ตัวอักษรเดียวที่เปลี่ยนแปลงภายใน identifier ยาว การจัดการช่องว่างเพิ่มสัญญาณรบกวน บรรทัดที่ลงท้ายด้วย CRLF และบรรทัดเดียวกันที่ลงท้ายด้วย LF จะแสดงว่าต่างกันภายใต้การเปรียบเทียบไบต์ที่เข้มงวด เครื่องมือส่วนใหญ่มีแฟล็กเพื่อทำให้ line ending เป็นมาตรฐานก่อน diff ในทำนองเดียวกัน ช่องว่างท้าย การเยื้องแท็บกับช่องว่าง และบรรทัดว่างล้วนสร้าง diff output ที่ไม่จำเป็น การเปิดใช้งานการทำให้ช่องว่างเป็นมาตรฐานมักเป็นค่าเริ่มต้นที่ถูกต้องเมื่อเปรียบเทียบโค้ดจากตัวแก้ไขหรือระบบปฏิบัติการต่างกัน

ความเสี่ยงด้านความเป็นส่วนตัวของเครื่องมือ diff ออนไลน์

บริการ diff และ pastebin ออนไลน์สะดวกสบาย: เปิด URL วางสองส่วน ได้ output ที่มีสี ปัญหาคือข้อความที่คุณวางถูกส่งไปยังเซิร์ฟเวอร์บุคคลที่สาม ขึ้นอยู่กับบริการ ข้อความนั้นอาจถูกบันทึก จัดทำดัชนี เก็บไว้ไม่มีกำหนด หรือแชร์กับผู้ให้บริการวิเคราะห์ สิ่งนี้สำคัญมากเมื่อโค้ดมีเนื้อหาที่ละเอียดอ่อน ข้อมูลประจำตัวที่ฮาร์ดโค้ด ชื่อโฮสต์ภายใน ตรรกะทางธุรกิจที่เป็นกรรมสิทธิ์ หรือข้อมูลที่ระบุตัวตนได้ล้วนอาจจบลงใน paste แม้ไม่มีความลับที่ชัดเจน โครงสร้างของโค้ดภายในสามารถเปิดเผยการตัดสินใจด้านสถาปัตยกรรมที่คุณต้องการเก็บเป็นส่วนตัว ความเสี่ยงไม่ใช่เรื่องสมมติ นักวิจัยด้านความปลอดภัยพบข้อมูลประจำตัวและโทเค็นภายในใน public pastes ซ้ำแล้วซ้ำเล่า บางบริการเก็บ paste ไว้แม้หลังจากผู้ใช้ลบเพราะมีสำเนาในแคชหรือสำรองข้อมูล ไม่มีทางยืนยันสิ่งที่บริการระยะไกลทำกับข้อความเมื่อมาถึง การบรรเทาที่เชื่อถือได้เพียงอย่างเดียวคือเก็บ diff ในเครื่อง ซึ่งหมายถึงการรันในเครื่องมือที่ไม่ส่งข้อความผ่านเครือข่ายเลย

ภาพหน้าจอของแผง network ในเบราว์เซอร์แสดงคำขอขาออกเป็นศูนย์ขณะที่โค้ดสองชุดกำลังถูกเปรียบเทียบในเครื่องมือ text-diff

การใช้งานจริงของ diff ในเครื่อง

Diff ไม่ได้ใช้สำหรับการตรวจสอบโค้ดเท่านั้น กรณีทั่วไปที่ diff ในเครื่องมีประโยชน์: ทบทวนการแก้ไขเอกสารหรือไฟล์คอนฟิกก่อน commit เปรียบเทียบสองเวอร์ชันของ Dockerfile, คอนฟิก Nginx หรือ Kubernetes manifest เพื่อเข้าใจสิ่งที่เปลี่ยนแปลงระหว่างการ deploy ตรวจสอบ config drift ระหว่างสภาพแวดล้อม หากคอนฟิก production และ staging ควรเหมือนกันยกเว้นชื่อโฮสต์และความลับ diff จะแสดงความแตกต่างที่ไม่ได้ตั้งใจทันที เปรียบเทียบการตอบสนอง API ในระหว่างการดีบัก การวางสอง JSON payload จาก REST หรือ GraphQL API และรัน diff ระดับคำจะระบุฟิลด์ที่เพิ่ม ค่าที่เปลี่ยน หรือคีย์ที่ลบออกโดยไม่ต้องอ่านผ่านหลายร้อยบรรทัดด้วยตนเอง ทบทวนโค้ดที่ LLM สร้างเทียบกับ baseline เมื่อโมเดล rewrite ฟังก์ชัน diff ระดับบรรทัดจะแสดงว่าตรรกะใดเปลี่ยนและอะไรยังคงเดิม เร็วกว่าการอ่านทั้งสองเวอร์ชันแยกกัน ในทุกกรณีเหล่านี้ ข้อความที่เกี่ยวข้องอาจมีความละเอียดอ่อน และการเก็บไว้ออกจากเซิร์ฟเวอร์ระยะไกลเป็นทางเลือกที่ตรงไปตรงมา

ทำในเบราว์เซอร์โดยไม่อัปโหลด

เครื่องมือ text-diff บนเว็บไซต์นี้รันการคำนวณ diff ทั้งหมดในเบราว์เซอร์ของคุณโดยใช้ JavaScript คุณวางสองข้อความลงในสองแผง และ diff จะแสดงทันทีแบบบรรทัดต่อบรรทัด สูงสุด 3000 บรรทัดต่อฝั่ง ไม่มีสิ่งใดถูกส่งไปยังเซิร์ฟเวอร์ ข้อความไม่ออกจากอุปกรณ์ของคุณ การใช้งานใช้อัลกอริทึมมาตรฐานบนพื้นฐาน LCS ที่ทำงานบนบรรทัด: แต่ละบรรทัดคือหนึ่งโทเค็น และเครื่องมือจะคำนวณว่าบรรทัดนั้นไม่เปลี่ยนแปลง ถูกเพิ่ม หรือถูกลบ โดยหา longest common subsequence ระหว่างสองเวอร์ชัน บรรทัดที่ไม่เปลี่ยนแปลงแสดงโดยไม่มีไฮไลต์ บรรทัดที่เพิ่มเป็นสีเขียว บรรทัดที่ลบเป็นสีแดง พร้อมตัวนับจำนวนการเพิ่มและการลบที่อัปเดตตลอด ปัจจุบันยังไม่มีโหมดระดับคำหรือระดับตัวอักษร และไม่มีสวิตช์ทำให้ช่องว่างเป็นมาตรฐาน ดังนั้นบรรทัดที่ต่างกันเฉพาะช่องว่างท้ายบรรทัดหรือรูปแบบการขึ้นบรรทัดใหม่ก็ยังจะแสดงว่าเปลี่ยนแปลงอยู่ดี เนื่องจากการคำนวณทำงาน client-side จึงทำงานแบบออฟไลน์ได้ ไม่มีบัญชี ไม่มีประวัติ ไม่มีการเก็บข้อมูล คุณสามารถเปรียบเทียบไฟล์คอนฟิกในเครื่องกับเทมเพลต ทบทวน patch ก่อนนำไปใช้ หรือตรวจสอบการตอบสนอง API สองชุดโดยไม่มีข้อความเหล่านั้นถึงบุคคลที่สาม

เครื่องมือที่กล่าวถึงในบทความนี้

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

diff แบบบรรทัดหรือแบบคำดีกว่าสำหรับโค้ด?

สำหรับงานตรวจสอบโค้ดส่วนใหญ่ diff แบบบรรทัดเป็นมาตรฐานและอ่านง่ายที่สุด เพราะโค้ดมีโครงสร้างตามบรรทัด diff แบบคำอาจช่วยได้เมื่อบรรทัดยาวและเปลี่ยนเพียงส่วนเล็กน้อย เช่น ค่า JSON บรรทัดเดียว แต่เครื่องมือนี้เปรียบเทียบที่ระดับบรรทัดเท่านั้น สำหรับกรณีนั้นให้ใช้บรรทัดที่ไฮไลต์เป็นตัวชี้แล้วมองหาความแตกต่างเล็กน้อยภายในบรรทัดนั้นด้วยตาเอง

ทำไมเครื่องมือ diff ออนไลน์จึงมีความเสี่ยงด้านความเป็นส่วนตัวแม้ใช้ HTTPS?

HTTPS ปกป้องข้อความระหว่างการส่งจากการดักฟัง แต่ไม่ปกป้องเมื่อถึงเซิร์ฟเวอร์ ผู้ดำเนินการบริการมีสิทธิ์เข้าถึงเนื้อหาที่วางไว้อย่างเต็มที่และสามารถบันทึก เก็บ หรือแชร์ได้ TLS เกี่ยวกับความปลอดภัยในการส่ง ไม่ใช่เกี่ยวกับสิ่งที่ผู้รับทำกับข้อมูล

เครื่องมือ text-diff เก็บประวัติการเปรียบเทียบที่ผ่านมาไหม?

ไม่ เครื่องมือไม่มี backend และไม่ส่งคำขอเครือข่าย เมื่อคุณปิดหรือโหลดแท็บซ้ำ ข้อความก็หายไป ไม่มีบัญชี ไม่มีประวัติที่บันทึก และไม่มี log ฝั่งเซิร์ฟเวอร์