लेख
कोड स्निपेट की तुलना बिना उन्हें अपलोड किए
हर बार जब आप दो फ़ाइलें किसी ऑनलाइन diff टूल में चिपकाते हैं, वह कोड आपकी मशीन छोड़ देता है। कॉन्फ़िग फ़ाइलें, डेटाबेस क्वेरी, किसी .env स्निपेट में दबी API कुंजियाँ: यह सब किसी ऐसे सर्वर तक जाता है जिसे आप नियंत्रित नहीं करते। यह लेख बताता है कि diff एल्गोरिद्म कैसे काम करते हैं, ग्रैन्युलैरिटी विकल्पों का व्यवहार में क्या अर्थ है, और तुलना को स्थानीय रखना क्यों मायने रखता है।
diff क्या गणना करता है
एक diff टूल दो टेक्स्ट लेता है और परिवर्तनों का वह न्यूनतम समूह खोजता है जो एक को दूसरे में बदल दे। मूल विचार सबसे लंबा साझा अनुक्रम, या LCS है: पंक्तियों (या टोकन) का सबसे लंबा अनुक्रम जो दोनों टेक्स्ट में एक ही क्रम में आता है, भले ही आसन्न न हो। उस साझा अनुक्रम में न आने वाली हर चीज़ या तो नए संस्करण में एक जोड़ है या पुराने से एक विलोपन। इसका शास्त्रीय एल्गोरिद्म Myers (1986) का है, जो सबसे छोटी edit script को O((N+M)D) समय में खोजता है, जहाँ N और M दो टेक्स्ट की लंबाई हैं और D संपादनों की संख्या है। व्यवहार में, अधिकांश टूल आरंभ की साझा पंक्तियों और अंत की साझा पंक्तियों को नज़रअंदाज़ करने के लिए एक पूर्व-प्रसंस्करण कदम जोड़ते हैं, समस्या को बदले हुए क्षेत्र तक घटाते हैं। परिणाम एक patch है: hunk का एक अनुक्रम, हर hunk संदर्भ पंक्तियों, विलोपनों और जोड़ों के एक सटे हुए ब्लॉक का वर्णन करता है। यही वह फ़ॉर्मैट है जिसका उपयोग Unix diff, Git, और अधिकांश कोड-समीक्षा टूल करते हैं।

पंक्ति, शब्द और वर्ण ग्रैन्युलैरिटी
किसी diff की ग्रैन्युलैरिटी तय करती है कि तुलना की इकाई के रूप में क्या गिना जाए। पंक्ति-आधारित diff अधिकांश टूल में डिफ़ॉल्ट है: हर पंक्ति को एक अकेले टोकन के रूप में लिया जाता है। यह तेज़ है और ऐसा आउटपुट देता है जो संदर्भ में पढ़ने में आसान है, पर यह पूरी पंक्ति को बदली हुई के रूप में चिह्नित करता है भले ही उस पंक्ति पर सिर्फ़ एक शब्द भिन्न हो। शब्द-स्तरीय diff, LCS चलाने से पहले हर पंक्ति को शब्दों में बाँटता है। यह एक पंक्ति के भीतर क्या बदला, उसकी बारीक तस्वीर देता है, जो गद्य, कॉन्फ़िग मानों, या JSON के लिए उपयोगी है। वर्ण-स्तरीय diff और आगे जाता है और किसी लंबे पहचानकर्ता के भीतर बदले एक अकेले अक्षर को उभार सकता है। रिक्त-स्थान (whitespace) का प्रबंधन शोर जोड़ता है। CRLF पर समाप्त होने वाली एक पंक्ति और LF पर समाप्त होने वाली वही पंक्ति सख़्त बाइट तुलना में भिन्न दिखेंगी। अधिकांश टूल diff से पहले पंक्ति-अंत सामान्यीकृत करने का एक विकल्प देते हैं। इसी तरह, अंत के अतिरिक्त रिक्त-स्थान, टैब बनाम स्पेस इंडेंटेशन, और रिक्त पंक्तियाँ सभी झूठा diff आउटपुट पैदा कर सकती हैं। अलग-अलग संपादकों या ऑपरेटिंग सिस्टम से आए कोड की तुलना करते समय रिक्त-स्थान सामान्यीकरण चालू करना आमतौर पर सही डिफ़ॉल्ट है।
ऑनलाइन diff टूल का गोपनीयता जोखिम
ऑनलाइन diff और pastebin सेवाएँ सुविधाजनक हैं: एक URL खोलें, दो स्निपेट चिपकाएँ, रंगीन आउटपुट पाएँ। समस्या यह है कि आपका चिपकाया टेक्स्ट किसी तीसरे-पक्ष के सर्वर तक भेजा जाता है। सेवा के आधार पर, वह टेक्स्ट लॉग, अनुक्रमित, अनिश्चित काल तक संग्रहीत, या एनालिटिक्स प्रदाताओं के साथ साझा किया जा सकता है। यह सबसे अधिक तब मायने रखता है जब कोड में संवेदनशील सामग्री हो। हार्डकोड किए गए क्रेडेंशियल, आंतरिक होस्टनाम, स्वामित्व वाली व्यावसायिक तर्कशक्ति, या व्यक्तिगत रूप से पहचान योग्य डेटा सभी किसी paste में पहुँच सकते हैं। स्पष्ट रहस्यों के बिना भी, आंतरिक कोड की संरचना ऐसे वास्तुशिल्प निर्णय उजागर कर सकती है जिन्हें आप निजी रखना चाहेंगे। यह जोखिम काल्पनिक नहीं है। सुरक्षा शोधकर्ताओं ने सार्वजनिक paste में बार-बार क्रेडेंशियल और आंतरिक टोकन पाए हैं। कुछ सेवाएँ उपयोगकर्ता द्वारा हटाने के बाद भी paste रखती हैं, क्योंकि प्रतियाँ कैश या बैकअप में मौजूद रहती हैं। यह सत्यापित करने का कोई तरीका नहीं कि टेक्स्ट पहुँचने के बाद कोई दूरस्थ सेवा उसके साथ क्या करती है। एकमात्र भरोसेमंद उपाय diff को स्थानीय रखना है, यानी उसे ऐसे टूल में चलाना जो टेक्स्ट कभी नेटवर्क पर न भेजे।

स्थानीय diff के व्यावहारिक उपयोग
diff केवल कोड-समीक्षा के लिए नहीं है। कुछ आम स्थितियाँ जहाँ स्थानीय diff उपयोगी है: कमिट करने से पहले किसी दस्तावेज़ या कॉन्फ़िग फ़ाइल के संपादनों की समीक्षा करना। किसी Dockerfile, Nginx कॉन्फ़िग, या Kubernetes manifest के दो संस्करणों की तुलना करना यह समझने के लिए कि तैनातियों के बीच ठीक-ठीक क्या बदला। वातावरणों के बीच कॉन्फ़िग बहाव जाँचना। यदि production और staging कॉन्फ़िग होस्टनाम और रहस्यों को छोड़कर समान माने जाते हैं, एक diff तुरंत किसी भी अनचाहे विचलन को दिखा देता है। डीबगिंग के दौरान API प्रतिक्रियाओं की तुलना करना। किसी REST या GraphQL API से दो JSON payload चिपकाना और एक शब्द-स्तरीय diff चलाना जोड़े गए फ़ील्ड, बदले मान, या हटाई गई की को सैकड़ों पंक्तियाँ हाथ से पढ़े बिना ठीक से पहचान देता है। एक आधार के विरुद्ध LLM-जनित कोड की समीक्षा करना। जब कोई मॉडल किसी फ़ंक्शन को फिर से लिखता है, एक पंक्ति-स्तरीय diff दिखाता है कि कौन-सी तर्कशक्ति बदली और कौन-सी वही रही, दोनों संस्करण अलग-अलग पढ़ने से तेज़। इन सभी मामलों में, संबंधित टेक्स्ट संवेदनशील हो सकता है, और इसे किसी दूरस्थ सर्वर से दूर रखना सीधा चुनाव है।
ब्राउज़र में करना, बिना अपलोड किए
इस साइट का text-diff टूल पूरी diff गणना आपके ब्राउज़र में JavaScript से चलाता है। आप दो टेक्स्ट दो पैनल में चिपकाते हैं और diff तुरंत, पंक्ति दर पंक्ति, हर तरफ़ 3000 पंक्तियों तक प्रस्तुत हो जाता है। कुछ भी सर्वर को नहीं भेजा जाता। टेक्स्ट कभी आपका डिवाइस नहीं छोड़ता। कार्यान्वयन पंक्तियों पर चलने वाला एक मानक LCS-आधारित एल्गोरिद्म उपयोग करता है: हर पंक्ति एक टोकन है, और टूल दोनों संस्करणों के बीच longest common subsequence निकालकर तय करता है कि वह अपरिवर्तित है, जोड़ी गई है, या हटाई गई है। अपरिवर्तित पंक्तियाँ बिना किसी हाइलाइट के, जोड़ी गई पंक्तियाँ हरे में, हटाई गई पंक्तियाँ लाल में दिखती हैं, साथ में जोड़ और घटाव की चलती गिनती। आज कोई शब्द-स्तर या character-स्तर मोड नहीं है और न ही कोई whitespace-normalization टॉगल, इसलिए कोई पंक्ति जो केवल trailing whitespace या line-ending style में अलग हो वह भी बदली हुई दिखेगी। चूँकि गणना क्लाइंट-साइड चलती है, यह ऑफ़लाइन काम करती है। कोई खाता नहीं, कोई इतिहास नहीं, कोई प्रतिधारण नहीं। आप किसी स्थानीय कॉन्फ़िग फ़ाइल की किसी टेम्पलेट से तुलना कर सकते हैं, लागू करने से पहले किसी patch की समीक्षा कर सकते हैं, या दो API प्रतिक्रियाएँ जाँच सकते हैं बिना उस टेक्स्ट के किसी तीसरे पक्ष तक पहुँचे।
इस लेख में उल्लेखित टूल्स
अक्सर पूछे जाने वाले सवाल
कोड के लिए पंक्ति-आधारित diff बेहतर है या शब्द-आधारित?
अधिकांश कोड-समीक्षा कार्यों के लिए, पंक्ति-आधारित diff मानक और पढ़ने में सबसे आसान है, क्योंकि कोड पंक्तियों से संरचित होता है। शब्द-आधारित diff तब मदद कर सकता है जब पंक्तियाँ लंबी हों और सिर्फ़ एक छोटा भाग बदला हो, जैसे किसी एक-पंक्ति JSON मान में, लेकिन यह टूल केवल पंक्ति-स्तर पर तुलना करता है; ऐसे मामले में, हाइलाइट की गई पंक्ति को एक संकेत की तरह इस्तेमाल करें और उसके भीतर के छोटे अंतर को आंख से ढूंढें।
ऑनलाइन diff टूल HTTPS उपयोग करने पर भी गोपनीयता जोखिम क्यों हैं?
HTTPS पारगमन में टेक्स्ट को छिपकर सुनने से बचाता है, पर सर्वर तक पहुँचने के बाद उसकी रक्षा नहीं करता। सेवा संचालक के पास चिपकाई गई सामग्री तक पूरी पहुँच होती है और वह उसे लॉग, संग्रहीत, या साझा कर सकता है। TLS पारगमन सुरक्षा के बारे में है, इस बारे में नहीं कि प्राप्तकर्ता डेटा के साथ क्या करता है।
क्या text-diff टूल पिछली तुलनाओं का कोई इतिहास संग्रहीत करता है?
नहीं। टूल का कोई बैकएंड नहीं है और यह कोई नेटवर्क अनुरोध नहीं करता। जैसे ही आप टैब बंद या पुनः लोड करते हैं, टेक्स्ट चला जाता है। कोई खाता नहीं, कोई सहेजा गया इतिहास नहीं, और कोई सर्वर-साइड लॉग नहीं।