2015-12-17 5 views
5

की इस पंक्ति को समझने में परेशानी होने के कारण मैं this line of code को एनपीएम moudle hash-index में समझने में सहायता की तलाश में हूं।पूर्णांक के लिए बफर। कोड

इस मॉड्यूल का उद्देश्य एक ऐसा कार्य होना है जो आपके द्वारा पारित दूसरे तर्क द्वारा इनपुट मोड के शा -1-हैश को लौटाता है।

var toNumber = function (buf) { 
    return buf.readUInt16BE(0) * 0xffffffff + buf.readUInt32BE(2) 
} 

मैं क्यों उन विशिष्ट ऑफसेट यह पता लगाने की प्रतीत नहीं कर सकते हैं:

इस मॉड्यूल है कि मुझे समझ नहीं आता में विशेष समारोह इस एक है कि इनपुट के रूप में एक बफर लेता है और एक पूर्णांक देता है बफर चुने जाते हैं और 0xffffffff द्वारा गुणा करने का उद्देश्य क्या है।

यह मॉड्यूल मेरे लिए वास्तव में दिलचस्प है और यह समझने में कोई मदद है कि यह बफर को पूर्णांक में कैसे परिवर्तित कर रहा है, इसकी सराहना की जाएगी!

उत्तर

2

यह बफर में पहली uint32 (अहस्ताक्षरित पूर्णांक 32 बिट) प्रिंट:

यहाँ एक समान प्रश्न पहले से ही उत्तर है।

सबसे पहले, यह बिग एंडियन का उपयोग करके बफर के पहले दो बाइट्स (यूआईएनटी 16) को पढ़ता है, फिर, यह 0xFFFFFFFF द्वारा गुणा करता है।

फिर, यह बफर में दूसरे चार बाइट्स (यूआईएनटी 32) को पढ़ता है, और इसे गुणा संख्या में जोड़ता है - जिसके परिणामस्वरूप बफर के पहले 6 बाइट से निर्मित एक संख्या होती है।

उदाहरण: विचार करें [बफर बी बी ए.ए. सीसी सीसी डीडी ...]

0xbb * 0xffffffff = 0xbaffffff45 
0xbaffffff45 + 0xaaccccdd = 0xbbaacccc22 

और ऑफसेट के बारे में है, यह उस तरह से चुना है:

पहली बार है, यह बाइट से पढ़ता को बाइट (टाइप करने के लिए coverts - UINT16)

दूसरी बार, यह बाइट से पढ़ता बाइट के लिए (टाइप करने के लिए कनवर्ट्स - यूआईएनटी 32)

तो इसे समेटने के लिए, यह बड़े एंडियन नोटेशन का उपयोग करके बफर के पहले 6 बाइट्स से एक संख्या बनाता है, और इसे कॉलिंग फ़ंक्शन पर लौटाता है।

आशा है कि यह आपके प्रश्न का उत्तर दे।

Wikipedia's Big Endian entry

संपादित

के रूप में किसी को टिप्पणी में कहा, मैं 0xFFFFFFFF 32 की एक बाएँ पारी होने के बारे में पूरी तरह से गलत था, यह सिर्फ एक संख्या गुणा है - मैं इसे किसी तरह का है यह सोचते हैं रहा हूँ आंतरिक प्रोटोकॉल का एक सही कानूनी बफर हेडर की गणना करने के लिए जो उनके अपेक्षा की अनुपालन करता है।

संपादित 2

मूल संदर्भ में समारोह पर देखने के बाद, मैं इस निष्कर्ष पर आए हैं:

यह फ़ंक्शन एक हैशिंग प्रवाह का एक हिस्सा है, और यह कि ढंग से काम करता है :

मुख्य प्रवाह एक स्ट्रिंग इनपुट और हैश आउटपुट के लिए अधिकतम संख्या प्राप्त करता है, फिर यह स्ट्रिंग इनपुट लेता है, इसे SHA-1 हैशिंग फ़ंक्शन में प्लग करता है।

SHA-1 हैशिंग रिटर्न एक बफर, यह है कि बफर लेता है, और उस पर हैश अनुक्रमण लागू होता है, के रूप में निम्नलिखित कोड अंश में देखा जा सकता:

return toNumber(crypto.createHash('sha1').update(input).digest()) % max 

इसके अलावा, यह करने के लिए एक modulu का उपयोग करता है सुनिश्चित करें कि हैश इंडेक्स लौटाया गया है, अधिकतम संभव हैश से अधिक नहीं है।

+2

बाएं शिफ्ट 16 बिट्स '0x10000' से गुणा करने के बराबर होंगे। मुझे यहां क्या समझ नहीं आ रहा है? – sqykly

+0

अच्छी पकड़, मुझे पूरी तरह उलझन में मिला - इस बिंदु पर मैं केवल यह मान सकता हूं कि यह संख्या उत्पन्न करने के लिए उनमें से कुछ आंतरिक प्रोटोकॉल है - शायद एक चेकसम नंबर या कुछ ऐसा है? – NadavL

+0

शायद यह अधिक समझ में आएगा '(uint << 32) - 1'? बस एक विचार – sqykly

0

2 से गुणा बाइट्स की शिफ्ट के बराबर 1 के बराबर है, इसलिए 2^16 से गुणा करने का उद्देश्य बिट्स को 16 गुना छोड़ने के बराबर है। Bitwise Logic in C

+0

'0xFFFFFFFF' 32 बिट्स नहीं है? – MinusFour

+0

वास्तव में यह है। मूल प्रश्न में चर केवल 16 बिट चौड़ा है हालांकि –

संबंधित मुद्दे