आपने सुना होगा (या यहां तक कि खुद भी कहा होगा) कि रेल्स / रूबी में बहुत अधिक जादू है...
- लेकिन वह विचार कहां से आता है?
- रेल्स जादू वास्तव में क्या है?
- और आप उस जादू को दूर करने के लिए क्या कर सकते हैं?
यहां मेरा विचार है:
जब कुछ जादू जैसा लगता है तो ऐसा इसलिए है क्योंकि कुछ ऐसा है जो आप नहीं जानते, कुछ जानकारी गायब है।
यह एक जादू की तरकीब की तरह है, यदि आप तरकीब जानते हैं तो कोई जादू नहीं है।

सॉफ्टवेयर विकास में, तरकीबों को जानना चीजें वास्तव में कैसे काम करती हैं इसकी समझ रखने के बराबर है।
आइए एक उदाहरण देखें!
यह उदाहरण BCrypt के बारे में है, एक हैशिंग एल्गोरिदम जिसका उपयोग पासवर्ड को सुरक्षित रूप से संग्रहीत करने के लिए किया जाता है। यह bcrypt जेम के माध्यम से रूबी में लागू किया गया है।
यहां BCrypt का उपयोग करके "testing" शब्द को हैश करने का तरीका बताया गया है:
require 'bcrypt' BCrypt::Password.create("testing") # "$2a$10$3o.xrISG8fqKfzKqDpgKn.3cwjFV//9C9cZ7MuK5S9sNKFBivB7YG" BCrypt::Password.create("testing") # "$2a$10$BFb/e3cWuAIyelcmkfGtE.GTifXHxig4IzVbdZs9C1zSpF/Jr6c3W" BCrypt::Password.create("testing") # "$2a$10$Q952BVgM783Y4kPvwvxwC.CS2DWUX9jQuDoE6q2R041kQY0ZWPnSe" ध्यान दें कि आपको हर बार एक अलग हैश मिलता है, लेकिन अगर आप MD5 (मत करो!) या SHA1 जैसी किसी चीज़ का उपयोग करते हैं तो आपको दिए गए स्ट्रिंग के लिए हमेशा समान आउटपुट मिलेगा।
BCrypt अलग तरीके से व्यवहार क्यों कर रहा है?
मैं एक सेकंड में बताऊंगा कि क्या हो रहा है, लेकिन पहले देखते हैं कि आप दो bcrypt हैश की तुलना कैसे करते हैं, एक डेटाबेस से आ रहा है और एक उपयोगकर्ता इनपुट से (जैसे फॉर्म या ऐसा कुछ)।
BCrypt::Password.new(@user.hash) == params[:password] # true
बाएं वाला हिस्सा (BCrypt::Password.new) एक BCrypt ऑब्जेक्ट है, जो पैरामीटर के रूप में डेटाबेस में संग्रहीत हैश लेता है।
दाएं वाला हिस्सा (params[:password]) सादा-पाठ पासवर्ड है जिसे उपयोगकर्ता लॉग इन करने का प्रयास कर रहा है।
इस मामले में हम मान लेते हैं कि सही उपयोगकर्ता / पासवर्ड संयोजन का उपयोग किया जा रहा है।
तो यह true का मूल्यांकन क्यों कर रहा है?
खैर, इसे समझने के लिए आपको दो चीजें जानने की जरूरत है:
- BCrypt "साल्ट" नामक किसी चीज़ का उपयोग करता है, जो पूर्व-गणना हैश के खिलाफ सुरक्षा बढ़ाने के लिए उपयोग किया जाने वाला एक यादृच्छिक मान है। साल्ट हैश में ही संग्रहीत होता है।
- रूबी में कई चीजें जो सिंटैक्स जैसी दिखती हैं वे सिर्फ मेथड्स हैं। यह डबल इक्वल्स ऑपरेटर (
==) के लिए मामला है।
यह जानकर, मैं आपको बता सकता हूं कि BCrypt अपना स्वयं का == मेथड परिभाषित करता है, जो जानता है कि उस "साल्ट" मान को कैसे निकालना है ताकि पासवर्ड की तुलना करते समय उसे ध्यान में रखा जा सके।
दूसरे शब्दों में:
BCrypt#== संग्रहीत हैश से "साल्ट" मान लेता है।
फिर यह सादा-पाठ पासवर्ड (उपयोगकर्ता इनपुट) को इस साल्ट का उपयोग करके हैश करता है ताकि दोनों हैश समान होंगे यदि पासवर्ड वैध है।
यदि आप स्रोत कोड देखें तो यह कुछ इस तरह दिखेगा:
def ==(secret) super( BCrypt::Engine.hash_secret(secret, @salt) ) end
याद रखें कि super उसी मेथड को (इस मामले में ==) पैरेंट क्लास पर कॉल करेगा।
BCrypt::Password की पैरेंट क्लास String है।
यह सब मेथड्स के बारे में है
समझने के लिए एक महत्वपूर्ण बात यह है कि कुछ कीवर्ड्स और कुछ सिंटैक्स तत्वों (जैसे पैरेंथेसिस) के अलावा, यह सब क्लासेस और मेथड्स के बारे में है।
यदि आप जानते हैं कि आप किस क्लास के साथ काम कर रहे हैं (जिसे आप class मेथड का उपयोग करके जांच सकते हैं) तो आप हमेशा जान पाएंगे कि कौन से ऑपरेशन (मेथड्स) उपलब्ध हैं।
लेकिन कभी-कभी हमारे पास बिना ऑब्जेक्ट के सिर्फ एक मेथड कॉल होता है।
इसका अक्सर मतलब होता है कि मेथड वर्तमान क्लास में परिभाषित है, लेकिन यह हमेशा ऐसा नहीं होता।
उदाहरण:
puts 123
puts कहां परिभाषित है? आइए पता करें:
method(:puts).owner # Kernel
एक और चीज़ जो भ्रमित कर सकती है वह है मेटाप्रोग्रामिंग, क्योंकि मेटाप्रोग्रामिंग के साथ आप प्रोग्राम निष्पादन के दौरान मेथड्स बना, संशोधित या यहां तक कि हटा सकते हैं। ये चीजें कोड को अधिक अपारदर्शी और अस्पष्ट बनाती हैं।
आप इस भ्रम को कम कर सकते हैं यह जानकर कि कौन से मेटाप्रोग्रामिंग मेथड्स उपलब्ध हैं और वे कैसे काम करते हैं।
सारांश
आपने सीखा कि चीजें वास्तव में कैसे काम करती हैं इसकी गहरी समझ आपको किसी भी "जादू" को दूर करने, बेहतर कोड लिखने और आपको एक बेहतर डेवलपर बनाने में कैसे मदद कर सकती है।
यदि आप अपने रूबी कौशल में सुधार करना चाहते हैं तो मेरी किताब, रूबी डीप डाइव देखें, जिसे बुनियादी बातों और अधिक उन्नत अवधारणाओं के बीच की खाई को पाटने के लिए डिज़ाइन किया गया है 🙂