मैं एक sha256 हैश को एक पूर्णांक में बदलने की कोशिश कर रहा हूं। यह सी # में काम करता है लेकिन मैं इसे पायथन में काम नहीं कर सकता।

C# Version :
string inputString = "TestString";
            SHA256 sha256Hash = SHA256.Create();
            byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(inputString));
            //Read the Bytes and print
            var sb = new StringBuilder(bytes.Length * 2);
            sb = new StringBuilder(bytes.Length * 2);
            foreach (byte b in bytes)
            {
                sb.Append(b.ToString("x2"));
            }
            Console.WriteLine("Bytes: " + sb);            
            Console.WriteLine("ConvertedInt: " + BitConverter.ToInt64(bytes));
Output :
Bytes: 6dd79f2770a0bb38073b814a5ff000647b37be5abbde71ec9176c6ce0cb32a27
ConvertedInt: 4088037490330425197

उपरोक्त बाइट्स और इंटीजर मान को अपेक्षित रूप से प्रिंट करता है। पायथन में ऐसा करने की कोशिश कर रहा है, लेकिन एक ही पूर्णांक संख्या में परिवर्तित नहीं हो सका।

import hashlib
hashobj = hashlib.sha256("TestString".encode('utf-8')).hexdigest()
print(hashobj)

#Tried Option 1:
print(f"Option 1 prints:\r")
print(int(hashobj,32))

#Tried Option 2:
print(f"Option 1 prints:\r")
print(int(hashobj,16))

Output:
6dd79f2770a0bb38073b814a5ff000647b37be5abbde71ec9176c6ce0cb32a27
Option 1 prints:
428476861264242379186014021585258195649378281633207959348811042267114033125399631735390859241543
Option 1 prints:
49683071055471546380350462257487304408748464885741562355821390565893091830311

मैं हैशबज को अजगर में 64 बिट इंट में कैसे बदल सकता हूं? बस अजगर में एक ही पूर्णांक मान प्राप्त करने की कोशिश कर रहा है, किसी भी मदद के लिए धन्यवाद।

1 संपादित करें:

@Sweeper और @Recursing के उत्तर के बाद, आगे बढ़ने में सक्षम था, लेकिन परिणामी पूर्णांक पर हस्ताक्षर किए जाने पर समस्या होती है।
केस १: हेक्स टू इंटीजर + वी है, जब मैं एक मॉड्यूलो int(8bytes) एक संख्या के साथ कोशिश करता हूं, तो ३००, अपेक्षित परिणाम १०८ देता है।
केस 2 और केस 3: हेक्स टू इंटीजर है -ve, फिर मुझे बाइट्स के वेरिएबल मम्बर को पढ़ना होगा, केस 2 के लिए 7 बाइट्स और केस 3 के लिए 9 बाइट्स, फिर 300 से मॉड्यूलो अपेक्षित परिणाम 108 देता है।

प्रश्न: समान परिणाम प्राप्त करने के लिए पूर्णांक -ve होने पर पढ़ने के लिए बाइट्स की संख्या कैसे निर्धारित करें? धन्यवाद।

#Case 1
hash_bytes = hashlib.sha256("098C10227K3R".encode('utf-8')).digest()
print("Case 1 : Is Positive : {}".format(int.from_bytes(hash_bytes[:8], byteorder="little", signed=True) > 0))
print("Case 1 : IntegerValue : {}".format(int.from_bytes(hash_bytes[:8], byteorder="little", signed=True)))
print("Case 1 : 8 Bytes:")
print(int.from_bytes(hash_bytes[:8], byteorder="little", signed=True) % 300)

#Case 2
hash_bytes = hashlib.sha256("159YK282MS3T".encode('utf-8')).digest()
print("Case 2 : Is Positive : {}".format(int.from_bytes(hash_bytes[:8], byteorder="little", signed=True) > 0))
print("Case 2 : IntegerValue : {}".format(int.from_bytes(hash_bytes[:8], byteorder="little", signed=True)))
print("Case 2 : 8 Bytes:")
print(int.from_bytes(hash_bytes[:8], byteorder="little", signed=True) % 300)
print("Case 2 : 7 Bytes:")
print(int.from_bytes(hash_bytes[:7], byteorder="little", signed=True) % 300)

#Case 3
print("Case 3:")
hash_bytes = hashlib.sha256("17FK427W501L".encode('utf-8')).digest()
print("Case 3 : Is Positive : {}".format(int.from_bytes(hash_bytes[:8], byteorder="little", signed=True) > 0))
print("Case 3 : IntegerValue : {}".format(int.from_bytes(hash_bytes[:8], byteorder="little", signed=True)))
print("Case 3 - 8 Bytes:")
print(int.from_bytes(hash_bytes[:8], byteorder="little", signed=True) % 300)
print("Case 3 - 9 Bytes:")
print(int.from_bytes(hash_bytes[:9], byteorder="little", signed=True) % 300)

Output:
Case 1 : Is Positive : True
Case 1 : IntegerValue : 9212408962392255108
Case 1 : 8 Bytes:
108
Case 2 : Is Positive : False
Case 2 : IntegerValue : -5822649536180381508
Case 2 : 8 Bytes:
192
Case 2 : 7 Bytes:
Case 3 : IntegerValue 7 bytes: 14015580891781308
108
Case 3:
Case 3 : Is Positive : False
Case 3 : IntegerValue : -2669588811718081008
Case 3 - 8 Bytes:
192
Case 3 - 9 Bytes:
Case 3 : IntegerValue 9 bytes: -445391446580747319792
108
0
SriramN 31 जिंदा 2020, 16:48

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि @ स्वीपर ने कहा, सी # कोड हैश के केवल पहले 8 बाइट्स रखता है, और इसे पूर्णांक में परिवर्तित करता है

पायथन में आप कर सकते हैं:

import hashlib
hash_bytes = hashlib.sha256("TestString".encode('utf-8')).digest()
first_bytes = hash_bytes[:8]
print(int.from_bytes(first_bytes, byteorder="little", signed=True))

एक विकल्प मानक पुस्तकालय में struct मॉड्यूल का उपयोग करना होगा: https:/ /docs.python.org/3/library/struct.html

print(struct.unpack("q", first_bytes))
0
Recursing 31 जिंदा 2020, 16:58