2011-01-12 8 views
5

मैं विकिपीडिया पर निम्नलिखित SHA256 pseudocode देख रहा हूं।इस फ्लोट के आंशिक भाग के पहले 32 बिट्स क्या हैं?

विशेष रूप से, मैं निम्नलिखित खंड देख रहा हूं।

//Initialize variables 
//(first 32 bits of the fractional parts of the square roots of the first 8 primes 2..19): 
h0 := 0x6a09e667 

मैं यह पता लगाने की कोशिश कर रहा हूं कि एच 0 कैसे उत्पन्न हुआ था। मुझे टिप्पणी से पता है कि यह 2 के वर्ग रूट का आंशिक हिस्सा होना चाहिए। मुझे विश्वास है कि मैं निम्नलिखित टाइप करके 2 के वर्ग रूट का आंशिक हिस्सा प्राप्त कर सकता हूं। निम्नलिखित सभी कोड पायथन प्रतिलिपि से हैं।

>>> math.modf(math.sqrt(2))[0] 
0.41421356237309515 

फ़ाइल के शीर्ष पर यह बताता है कि सभी स्थिरांक की घोषणा बिग एंडियन है। मुझे पता है कि मेरा पर्यावरण छोटा एंडियन है क्योंकि मैं टाइप करता हूं।

>>> import sys 
>>> sys.byteorder 
'little' 

तो, H0 में हेक्स मान की मेरी पुस्तिका में गड़बड़ी के अनुसार, लिटल एन्डियन प्रतिनिधित्व 0x67e6096a होना चाहिए।

>>> int(0x67e6096a) 
1743128938 

और मैं अटक गया हूं। मैंने विभिन्न जोड़ों की कोशिश की है, लेकिन उनमें से कोई भी इस परिणाम के साथ समाप्त नहीं हुआ है। मुझे नहीं पता कि फ्लोटिंग पॉइंट नंबर के आंशिक भाग के पहले 32 बिट कैसे प्राप्त करें। मुझे पता है कि किसी भी तरह से मेरा 0.41421356237309515 (फ्लोट) परिणाम 1743128938 (int) में परिवर्तित किया जा सकता है, लेकिन मुझे वास्तव में कोई जानकारी नहीं है। फ़्लोटिंग पॉइंट नंबर के आंशिक भाग के पहले 32 बिट्स प्राप्त करने के लिए आवश्यक कदम क्या हैं? पाइथन केवल उत्तर दें।

धन्यवाद।

उत्तर

8

एंडियननेस हेक्साडेसिमल स्थिरांक के लिए कोई फर्क नहीं पड़ता; प्रत्येक अंक एक कमजोर है, कम से कम महत्वपूर्ण निबल आखिरी है। इससे कोई फर्क नहीं पड़ता कि आप अलग-अलग आकार पॉइंटर्स से निपटते हैं। यदि आपको बाइट ऑर्डर का उपयोग करने की आवश्यकता है, तो संरचना मॉड्यूल मदद कर सकता है। किसी भी तरह, आपने आंशिक भाग को ठीक से पुनर्प्राप्त कर लिया है; यह हेक्स को बदलने आसानी से बस गुणा और छोटा द्वारा किया जाता है, तो हम एक पूर्णांक प्राप्त:,

>>> hex(int(math.modf(math.sqrt(2))[0]*(1<<32))) 
'0x6a09e667' 
+0

तो, क्योंकि पाइथन हेक्स स्थिरांक के साथ एक छोटी, int, लंबी (या जो कुछ भी) के बजाय "निबल्स की धारा" के रूप में कार्य करता है, मुझे बाइट ऑर्डर के बारे में चिंता करने की ज़रूरत नहीं है? क्या वह पाइथन शाब्दिक हेक्स स्थिरांक प्रभावी ढंग से हमेशा बिग एंडियन नहीं बनायेगा?क्षमा करें अगर एक बेवकूफ सवाल है, लेकिन मैं आसानी से उलझन में हूँ। :) –

+0

हाँ का क्रमबद्ध करें, लेकिन यह पायथन विशिष्ट नहीं है। यही वह आदेश है जिसे हम संख्या लिखते हैं। ध्यान दें कि यह आदेश अरबी लेखन से विरासत में मिला है, जहां पाठ बाईं ओर दाएं हो जाता है; उस दृश्य के साथ, यह थोड़ा प्यारा है। यह बाइट्स में विभाजित नहीं है, हालांकि, बाइट स्वैपिंग प्रासंगिक नहीं है। –

6
  1. विंडोज पर हेक्स में पूरे हिस्सा अपने कैलकुलेटर का उपयोग करें sqrt गणना करने के लिए (2) (1,4142135623730950488016887242097)
  2. दशमलव भाग लें (0.4142135623730950488016887242097)
  3. गुणा 2^32 (1779033703,9520993849027770600526)
  4. एक्सप्रेस द्वारा (6A09E667)

वोला। (पाइथन उत्तर नहीं करने के लिए ओपी से माफ़ी, लेकिन मुझे उम्मीद है कि विधि स्पष्ट है।)

+0

ठीक है, यह एक अजगर नहीं है जवाब, लेकिन यह मेरी समस्या को मुझे समझाया। मैं देखता हूं कि मैं जो गलती कर रहा था वह 10^एन द्वारा आंशिक भाग को गुणा करने का प्रयास कर रहा था, जहां एन एक पूर्णांक है जो सबसे बड़ा n है जिसमें fractional_part_of (वर्ग (2)) * (10^n) अभी भी एक में निहित हो सकता है हस्ताक्षर 4 बाइट पूर्णांक। मैं तब एक परिणाम प्राप्त करने के लिए उस परिणाम और कास्टिंग (फर्श के साथ) ले रहा था। हाहा, मैं बहुत मूर्ख हूँ। –

3
>>> math.sqrt(2).hex() 
'0x1.6a09e667f3bcdp+0' 

स्लाइस की जरूरत के रूप में उदाहरण के लिए:

>>> '0x'+math.sqrt(2).hex().split('.')[1][:8] 
'0x6a09e667' 
+0

दिलचस्प, मुझे नहीं पता था कि आप एक फ्लोटिंग पॉइंट नंबर का प्रतिनिधित्व करने के लिए हेक्स का उपयोग कर सकते हैं। आज बहुत कुछ सीखना –

+0

हम यहां भी ध्यान देते हैं कि यह गोलाकार मूल्य के बजाय एक छोटा मूल्य है। '2 ** - 33' जोड़ना इसे 0x6a09e668 पर बंद कर देगा। –

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