Luhn एल्गोरिदम ही वह कारण है कि कार्ड नंबर का अंत ऐसे अंक पर होता है जो मनमाना लगता है। यह एक चेकसम है — अपने से पहले के हर अंक का छोटा गणितीय सार — और यह सबसे आम स्वचालित जाँच है जिसे कार्ड नंबर को किसी और चीज़ से पहले पास करना होता है। इसे 1950 के दशक में IBM में Hans Peter Luhn ने विकसित किया था और बाद में कार्ड क्रमांकन को नियंत्रित करने वाले अंतर्राष्ट्रीय मानक के ज़रिए यह भुगतान कार्डों की परंपरा बन गया।
यह लेख बताता है कि चेक अंक किस काम आता है, कागज़ पर इसे कैसे निकाला जाता है, यह अधिकांश टाइपिंग गलतियाँ क्यों पकड़ लेता है, और इसका पास हो जाना उससे कहीं कम क्यों सिद्ध करता है जितना लोग मान लेते हैं।
Luhn एल्गोरिदम करता क्या है
कार्ड नंबर लें, अंतिम अंक को अलग रख दें, और बाकी अंकों पर एक निश्चित प्रक्रिया चलाएँ। परिणाम यह तय करता है कि अंतिम अंक क्या होना चाहिए। जब अंतिम अंक अपने से पहले के सब कुछ के अनुरूप हो, तब संख्या स्वीकार की जाती है।
इस प्रक्रिया में कहीं कोई बैंक, कोई खाता सूची या कोई रहस्य शामिल नहीं होता। यह पाठ्यपुस्तकों में छपा गणित है, लगभग हर प्रोग्रामिंग भाषा में उपलब्ध है, और एक मिलीसेकंड के छोटे से अंश में निकाला जा सकता है। यह ठीक एक संकीर्ण प्रश्न का उत्तर देता है: क्या इस श्रृंखला में कोई स्पष्ट लिप्यंतरण त्रुटि है?
वह संकीर्णता भूल जाना आसान है। चूँकि चेकसम चेकआउट फ़ॉर्म में सबसे दिखने वाली स्वचालित जाँच है, लोग यह मानने लगते हैं कि वह अपनी क्षमता से अधिक बता देती है।
चेक अंक हाथ से कैसे निकालें?
यह प्रक्रिया उन अंकों पर दाएँ से बाएँ चलती है जो अंतिम अंक हटाने के बाद बचते हैं।
- अंकों को लिख लें और दाईं ओर से उनकी स्थितियाँ एक से शुरू करके गिनें।
- सम स्थिति वाले हर अंक को दुगना करें।
- यदि दुगना मान नौ से ऊपर चला जाए, तो उसमें से नौ घटा दें — यह वही है जो परिणाम के दोनों अंकों को जोड़ने पर मिलता है।
- सारे मान जोड़ दें।
- देखें कि दस के अगले गुणज तक पहुँचने के लिए कितना जोड़ना पड़ेगा। वही मात्रा चेक अंक है।
एक छोटा उदाहरण इसे ठोस बना देता है। किसी लंबी संख्या का मुख्य भाग मानकर पाँच अंक लें — 1, 2, 3, 4 और 5 — और उन्हें दाईं ओर से गिनें: 5 पहली स्थिति में, 4 दूसरी में, 3 तीसरी में, 2 चौथी में और 1 पाँचवीं में। सम स्थितियों को दुगना करने पर 4 आठ बन जाता है और 2 चार। अब मान हैं 1, 4, 3, 8 और 5, जिनका योग 21 है। दस का अगला गुणज 30 है, इसलिए चेक अंक 9 है और पूरी श्रृंखला 9 पर समाप्त होती है।
पूरी लंबाई के कार्ड नंबर के लिए यह काम हाथ से करना उबाऊ है पर कभी अस्पष्ट नहीं। सॉफ़्टवेयर इसे श्रृंखला के अंत से चलकर करता है, और यही वजह है कि गलत सिरे से शुरू करने वाला कार्यान्वयन बिल्कुल सही नंबरों को भी ठुकरा देता है।
दुगना करने का नियम अंकों की अदला-बदली क्यों पकड़ता है?
दुगना करने का नियम मनमाना नहीं है। यह हर अंक का भार उसकी स्थिति पर निर्भर बना देता है, इसलिए दो पड़ोसी अंकों की अदला-बदली सामान्यतः कुल योग बदल देती है।
यह मायने रखता है क्योंकि किसी संख्यात्मक फ़ील्ड पर इंसान की दो सबसे आम गलतियाँ हैं — एक अंक गलत टाइप कर देना और दो पास-पास के अंकों की अदला-बदली। एक गलत अंक योग को शून्य से अलग मात्रा में खिसका देता है, इसलिए चेकसम लगभग हमेशा विफल हो जाता है। पड़ोसियों की अदला-बदली भी योग बदल देती है, क्योंकि जोड़ी में से एक अंक दुगना किया गया था और दूसरा नहीं।
लगभग, हमेशा नहीं। कुछ अदला-बदलियाँ इस जाँच की आँखों से ओझल रह जाती हैं। क्लासिक खामी वह जोड़ी है जिसमें शून्य और नौ साथ बैठते हैं: नौ को दुगना करके नौ घटाने पर फिर नौ ही मिलता है, इसलिए ये दोनों जगह बदलकर भी योग नहीं बदलते। कुछ और जोड़ियाँ भी ऐसा ही व्यवहार करती हैं। तब इस जाँच का सटीक वर्णन यह है कि यह हर एकल-अंक त्रुटि पकड़ती है और पड़ोसी अंकों की अदला-बदली में से अधिकांश पकड़ती है, पर सभी नहीं।
चेक अंक आपको क्या नहीं बता सकता
वह यह नहीं बता सकता कि कोई नंबर असली है। इस गणित में कहीं किसी जारीकर्ता का उल्लेख नहीं होता, इसलिए किसी भी प्रीफ़िक्स के साथ कोई भी बीच के अंक जोड़कर एक मान्य अंतिम अंक निकाला जा सकता है।
वह यह भी नहीं बता सकता कि कोई खाता चालू है, किसी कार्ड को रद्द नहीं किया गया, या नंबर टाइप करने वाले व्यक्ति के हाथ में वही कार्ड है। इनमें से हर प्रश्न के लिए जारीकर्ता को अधिकरण अनुरोध चाहिए, और यही वह क्रिया है जिससे किसी परीक्षण वातावरण को बचना ही होता है।
वह समाप्ति तिथि, कार्डधारक के नाम या सुरक्षा कोड की भी गारंटी नहीं ले सकता। ये फ़ील्ड चेक अंक के बगल में अपने अलग नियमों के साथ बैठे होते हैं, और जो नंबर चेकसम पूरा करता है उसके साथ ऐसी तारीख भी जोड़ी जा सकती है जो बीत चुकी हो और ऐसा कोड भी जो किसी से मेल न खाए।
इस साइट के जनरेटर द्वारा लौटाए जाने वाले डेटा का ईमानदार वर्णन यही है: हर मान संरचना में मान्य है और इस चेकसम के अनुरूप है, और उनमें से हर एक ऐसा नंबर है जो कभी किसी को जारी नहीं हुआ।
यही चेकसम और कहाँ दिखता है
भुगतान कार्ड इस विधि के सबसे प्रसिद्ध उपयोगकर्ता हैं, केवल एकमात्र नहीं। सस्ती टाइपिंग-सुरक्षा चाहने वाली क्रमांकन योजनाएँ अक्सर इसी सार्वजनिक गणित का सहारा लेती हैं, जिनमें कई राष्ट्रीय पहचान संख्याएँ, तरह-तरह के लॉयल्टी और गिफ्ट कार्ड सिस्टम तथा कई आंतरिक पहचानकर्ता शामिल हैं।
इस पुनरुपयोग का एक व्यावहारिक परिणाम है। जो साझा सहायक दिनचर्या किसी पास हुए चेकसम को क्रेडिट कार्ड का प्रमाण मान लेती है, वह बाकी हर उस चीज़ का गलत वर्गीकरण करेगी जो संयोग से वही शर्त पूरी करती हो। दिनचर्या का नाम उसके काम के आधार पर रखें — मॉड 10 चेकसम — न कि उस क्षेत्र के आधार पर जहाँ आपसे उसकी पहली भेंट हुई।
डेवलपर के लिए: जाँचों का क्रम और आम जाल
सत्यापन का क्रम लोगों की अपेक्षा से कहीं ज़्यादा मायने रखता है, और चेकसम शुरुआत की सही जगह नहीं है।
पहले लंबाई जाँचें, क्योंकि इस प्रक्रिया की अपनी कोई राय नहीं होती कि उसे कितने अंक दिए गए; पाँच अंकों का टुकड़ा भी चेकसम के अनुरूप होकर बेकार रह सकता है। उसके बाद अक्षरों का समूह जाँचें, ताकि अक्षर, फालतू खाली स्थान और विभाजक किसी भी गणना से पहले ठुकरा दिए जाएँ। इसके बाद चेकसम निकालें, और तभी प्रीफ़िक्स से नेटवर्क पहचानने का प्रयास करें।
तीन जाल बार-बार सामने आते हैं:
- शुरुआती शून्य को निरर्थक मान लेना। कार्ड नंबर श्रृंखलाएँ होती हैं, पूर्णांक नहीं, और संख्यात्मक पार्स चुपचाप एक अंक गिरा सकता है, जिससे ऐसी चेकसम विफलता बनती है जिसका उपयोगकर्ता की टाइपिंग से कोई संबंध नहीं होता।
- दुगना करने का दौर बाईं ओर से चलाना। स्थिति दाईं ओर से परिभाषित होती है, इसलिए दिशा कार्यान्वयन का ब्यौरा नहीं, विनिर्देश का हिस्सा है।
- चेकसम विफलता को कार्ड ठुकराए जाने के रूप में बताना। इसका अर्थ खराब इनपुट है, और उपयोगकर्ता को दिखाया जाने वाला संदेश यही कहना चाहिए।
परीक्षण डेटा के लिए उपयोगी ढंग जोड़ियाँ रखना है: एक नंबर जो पास होता है और वही नंबर एक अंक बदलने पर जो विफल हो जाता है। इससे सूट को एक सकारात्मक और एक नकारात्मक मामला मिलता है जिनके बीच ठीक एक अक्षर का अंतर है, जिससे रिग्रेशन एक नज़र में दिख जाता है। प्रारूप गाइड उन लंबाई और प्रीफ़िक्स नियमों को कवर करती है जो चेकसम से पहले चलने चाहिए, और सत्यापन की पूरी राह उस क्रम को एक साथ जोड़ती है।
किसी असली श्रृंखला पर चेकसम जाँचना
सहज समझ बनाने का सबसे तेज़ रास्ता है कुछ श्रृंखलाएँ कार्ड नंबर जनरेटर से गुज़ारना। एक बैच बनाएं, हाथ से एक अंक बदलें और चेक को विफल होते देखें; दोबारा बनाएं और देखें कि केवल अंतिम अंक हिलता है जबकि उससे पहले सब कुछ स्थिर रहता है। इसके बाद नेटवर्क तुलना पढ़ना उपयोगी है, क्योंकि वही गणित पंद्रह और सोलह अंकों की योजनाओं में अलग व्यवहार करती है और यही अंतर हाथ से लिखी सहायक दिनचर्याओं को उलझा देता है।
आगे क्या करें
कोड लिखने से पहले अपना सत्यापन क्रम लिख डालें, जिसमें चेकसम अंत से एक पहले हो, और अपने सूट के हर मान्य नंबर के लिए एक जानबूझकर बिगाड़ा हुआ फ़िक्स्चर भी रखें। जब यह देखना हो कि लंबाइयाँ और प्रीफ़िक्स अंतिम अंक के साथ कैसे मिलकर काम करते हैं, तो कार्ड नंबर प्रारूप गाइड आगे पढ़ें।