2009-11-22 15 views
11

में परिवर्तित करें md5 हैश को मॉड्यूलस ऑपरेशन करने के लिए एक अद्वितीय पूर्णांक में कनवर्ट करने का सबसे प्रभावी तरीका क्या है?32-char md5 स्ट्रिंग को पूर्णांक

+0

क्या आप हैश% x या x% हैश करना चाहते हैं? पहले मामले में आपको जवाब की गणना करने के लिए पूरे हैश की भी आवश्यकता नहीं हो सकती है। – Joren

+0

मैं हैश% X – ensnare

+0

देख रहा हूं क्या इनमें से कोई भी उत्तर उपयोगी है या आपको अभी भी अधिक अंतर्दृष्टि की आवश्यकता है? –

उत्तर

23

चूंकि समाधान भाषा निर्दिष्ट नहीं की गई थी, इसलिए इस उदाहरण के लिए पायथन का उपयोग किया जाता है।

import os 
import hashlib 

array = os.urandom(1 << 20) 
md5 = hashlib.md5() 
md5.update(array) 
digest = md5.hexdigest() 
number = int(digest, 16) 

print(number % YOUR_NUMBER) 
+0

एक एमडी 5 128 बिट जानकारी है। एक अजगर int आमतौर पर जानकारी के 32 या 64 बिट्स होने जा रहा है, इसलिए एक int में कनवर्ट करना डेटा को फेंकने जा रहा है, है ना? मुझे लगता है कि आपको लंबे समय तक उपयोग करने की ज़रूरत है। – elhefe

+4

बह, कभी भी ध्यान न रखें, int() यदि आवश्यक हो तो एक लंबा लौटाएगा। – elhefe

+0

आप इसे आधार 16 में क्यों परिवर्तित करते हैं? क्या यह सम्मेलन है? – Nate

2

एक 64 बिट पूर्णांक में फिट होने की तुलना में एमडी 5 में अधिक डेटा है, इसलिए एक अद्वितीय पूर्णांक प्राप्त करने के लिए कोई तरीका नहीं है (बिना प्लेटफ़ॉर्म का उपयोग किए जा रहे हैं)। आप हेक्स संस्करण को डेटा के कई पूर्णांक के रूप में परिवर्तित करके कुछ अतिरिक्त अनूठा प्राप्त कर सकते हैं, फिर उन्हें जोड़कर (अतिरिक्त या गुणा)। आप इसके बारे में कितना सटीक होंगे इस पर निर्भर करता है कि आप किस भाषा का उपयोग कर रहे हैं।

भाषा की इच्छा के बहुत से unpack या sscanf फ़ंक्शन को लागू करने के लिए लागू होते हैं, जो दिखने के लिए अच्छी जगहें हैं।

+2

आप मानते हैं कि "पूर्णांक" 64 बिट्स तक सीमित है। BigInteger के बारे में क्या? –

+1

बेशक, लेकिन प्लेटफॉर्म के बहुत से मनमाना लंबाई पूर्णांक नहीं हैं। अगर (मूल) BigInteger कार्यान्वयन है तो पूरी तरह से निर्भर करता है कि आप किस प्लेटफॉर्म पर हैं। –

+2

बिल्कुल, लेकिन "यह आपके प्लेटफॉर्म पर निर्भर करता है" जैसा कोई नहीं है ":) –

3

आपने यह नहीं कहा है कि आप किस प्लेटफॉर्म पर चल रहे हैं, या इस हैश का प्रारूप क्या है। संभवतः यह हेक्स है, इसलिए आपके पास 16 बाइट जानकारी है।

इसे अद्वितीय पूर्णांक में बदलने के लिए, आपको मूल रूप से 16-बाइट (128-बिट) पूर्णांक प्रकार की आवश्यकता होती है। कई प्लेटफार्मों में ऐसे प्रकार का मूल रूप से उपलब्ध नहीं है, लेकिन आप जावा या .NET 4.0 में 0 #मानों या सी # या जावा में BigInteger का उपयोग कर सकते हैं।

संकल्पनात्मक रूप से आपको हेक्स स्ट्रिंग को बाइट्स पर पार्स करने की आवश्यकता है, और फिर बाइट्स को एक पूर्णांक (या दो) में परिवर्तित करें। ऐसा करने का सबसे प्रभावी तरीका पूरी तरह से निर्भर करेगा कि आप किस प्लेटफ़ॉर्म का उपयोग कर रहे हैं।

+0

धन्यवाद। यह php में कैसे किया जा सकता है? – ensnare

+1

आप PHP में sscanf को देख रहे होंगे: http://au.php.net/manual/en/function.sscanf.php –

+0

सिवाय इसके कि sscanf '% x' प्रारूप जैसा प्रतीत नहीं होता है, जब तक कि यह सिर्फ मैं ... –

0

आपको अपने स्वयं के हैश फ़ंक्शन को परिभाषित करने की आवश्यकता होगी जो किसी MD5 स्ट्रिंग को वांछित चौड़ाई के पूर्णांक में परिवर्तित कर दे। यदि आप एक सादा स्ट्रिंग के रूप में MD5 हैश की व्याख्या करना चाहते हैं, तो आप FNV एल्गोरिदम का प्रयास कर सकते हैं। यह बहुत तेज़ और काफी समान रूप से वितरित है।

2

यदि आपको केवल मॉड्यूलस की आवश्यकता है, तो आपको इसे 128-बाइट पूर्णांक में परिवर्तित करने की आवश्यकता नहीं है। आप इस तरह से बाइट द्वारा अंक या बाइट द्वारा अंक प्राप्त कर सकते हैं।

mod=0 
for(i=0;i<32;i++) 
{ 
    digit=md5[i]; //I presume you can convert chart to digit yourself. 
    mod=(mod*16+digit) % divider; 
} 
संबंधित मुद्दे