2011-10-15 21 views
9

http://www.anyexample.com/programming/java/java_simple_class_to_compute_md5_hash.xml में एक उदाहरण दिया गया है कि स्ट्रिंग के एमडी 5 हैश की गणना कैसे करें। इसका परिणाम 20 अंकों हेक्स स्ट्रिंग में होता है। http://en.wikipedia.org/wiki/MD5 के अनुसार मैं 32 अंकों की हेक्स स्ट्रिंग की अपेक्षा करता हूं। मुझे How can I generate an MD5 hash? में dac2009 प्रतिक्रिया का उपयोग करने के लिए उदाहरण के लिए एक ही परिणाम मिलता है।जावा गणना एमडी 5 हैश

मुझे ऐसा कुछ क्यों मिलता है जो MD5 हैश जैसा दिखता है लेकिन नहीं? मैं कल्पना नहीं कर सकता कि मुझे मिलने वाले सभी तारों को मुझे 12 अग्रणी शून्यों के साथ पैड करना है।

संपादित करें: एक कोड उदाहरण

public static String MungPass(String pass) throws NoSuchAlgorithmException { 
    MessageDigest m = MessageDigest.getInstance("MD5"); 
    byte[] data = pass.getBytes(); 
    m.update(data,0,data.length); 
    BigInteger i = new BigInteger(1,m.digest()); 
    return String.format("%1$032X", i); 
} 

से बजाय http://snippets.dzone.com/posts/show/3686

+0

आपका पहला लिंक 404 – Paul

+2

है कृपया एक छोटा उदाहरण (पूर्ण) कोड पोस्ट करें जो आपके द्वारा की जा रही समस्या का प्रदर्शन करता है। इसके बिना, हम आपको यह नहीं बता सकते कि आप क्या गलत कर रहे हैं :) आपके द्वारा लिंक किए गए स्टैक ओवरव्लो प्रश्न में वर्णित विधि यह है कि आप एक MD5 हैश उत्पन्न करते हैं जो वास्तव में 32 हेक्स वर्ण –

+0

है पहला लिंक यहां काम करता है ... – AndyAndroid

उत्तर

3

कोड के रूप में दे देंगे उदाहरण जो आपने लिंक किया है, मेरी राय खराब कोड में है । ऐसा लगता है कि ऑटोर नहीं जानता कि कंप्यूटर कैसे काम करता है। हालांकि, बहुत बेहतर उदाहरण हैं।

पिछले उदाहरण एक आप खोज रहे हैं है। Chech इस Ideone: http://ideone.com/ZeN8a


अद्यतन 0: मैं एक स्ट्रिंग ("%1$032X") स्वरूपण का इस तरह से पहले कभी नहीं देखा है, इसलिए मैं नहीं जानता कि यह क्या करता है। एमडी 5 हैश का प्रतिनिधित्व करने के लिए आपको 128 बिट्स की आवश्यकता है और मैं उस प्रारूप का उपयोग करने के बजाय बिगइंटर के स्ट्रिंग प्रस्तुति को बनाने के लिए बिगइंटर के toString(16) विधि का उपयोग करने का सुझाव दूंगा।

String hashtext = bigInt.toString(16); 

अद्यतन 1: मैं वास्तव में अब और नहीं पता है कि प्रदान की कोड के साथ गलत है। इसे आज़माएं:

System.out.println(MungPass("java")); 

और यदि वह अभी भी 20 अंक उत्पन्न करता है, तो जावा को पुनर्स्थापित करने का प्रयास करें। मैं प्रेरणा से बाहर हूँ।

+0

मैंने पहले लिंक में दिया है -> 20 वर्ण, मैंने दूसरे लिंक को देखा -> उस पोस्ट पर टिप्पणी करें: यह पिछली रिक्त स्थान को अनदेखा करता है। तो न तो विधि ठीक काम करने लगती है। क्या आप इन्हें चलाने में सफल रहे? – AndyAndroid

+0

ठीक है मैंने अपना रिटर्न स्टेटमेंट बदल दिया "वापसी i.toString (16);"। मुझे अभी भी एक ही परिणाम मिल रहा है। 20 अंक क्या आपने कोड चलाया और 32 अंक प्राप्त किए? – AndyAndroid

+0

पुनर्स्थापित करना संभव नहीं है, यह एक एंड्रॉइड फोन पर चलता है, लेकिन आप सही हैं कि मैंने एक सादा डेस्कटॉप जावा इंस्टॉल में कोशिश की, वहां 32 अंक हैं। शायद एंड्रॉइड में एक बग। आपकी सभी मदद का धन्यवाद। – AndyAndroid

40

उपयोग org.apache.commons.codec.digest.DigestUtils लिया गया:

DigestUtils.md5Hex(str); 

यह आप 32 वर्ण स्ट्रिंग एक परिणाम

+2

चूंकि यह एक मोबाइल ऐप है, इसलिए मैं किसी भी अतिरिक्त पैकेज का उपयोग नहीं करना चाहता, बल्कि "सादा जावा" के साथ रहूंगा। – AndyAndroid

+5

विषय शीर्षक भ्रामक है, क्योंकि मोबाइल के बारे में कोई उल्लेख नहीं है। उदाहरण के लिए यह उत्तर मेरे लिए उपयोगी और सरल है, क्योंकि मैं एक साधारण जावा उदाहरण खोजता हूं। यह उत्तर मेरे लिए बिल्कुल सही है :) – sarkiroka

+1

@sarkiroka अगर शीर्षक/टैग ने "मोबाइल" का उल्लेख किया है, तो हो सकता है कि आपने इस पृष्ठ को खोलने की कोशिश नहीं की हो। यदि ओपी एक विशिष्ट उत्तर पसंद नहीं करता है, तो उसे ऐसा करने का अधिकार है। इसे अपराध के रूप में लेने की जरूरत नहीं है। :) – Sufian

1

मैंने ऊपर दिए गए आपके उदाहरण की कोशिश की, मुंगपास ("जावा") और मुझे 32 अंक स्ट्रिंग, 93f725a07423fe1c889f448b33d21f46 मिला। चूंकि आपने दौड़ने के दौरान उन 20 में से पहला सही पाया है, मुझे लगता है कि आप प्रिंटआउट में बस कुछ खो रहे हैं?

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