2010-11-29 12 views
6

मैं कैसे जावा के लिए php से इन कुछ पंक्तियों को साकार करने नहीं जानता है ..MD5 हैश अलग

$varInHex = "\x22\x33\xAd\xB5\x2b\xE6\x22\x33\x12\x36\x22\x31\xCA\x22\x11\x41\x62\x21\x22\x01\x55\x22\x71\x42\x10\x36";<br/><br/> 
$result = md5($varInHex); 
echo $result; 

ठीक है, मैं यह परिवर्तित करने की कोशिश की, लेकिन मैं एक अलग परिणाम हो रही है! जावा में

byte[] seq20 = new byte[]{(byte)0x22,(byte)...etc...}; 
String str = seq20.toString(); 
String result = md5(str); 
System.out.println(result); 

public static String md5(String source) { 
    try { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     byte[] bytes = md.digest(source.getBytes("UTF-8")); 
     return getString(bytes); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

private static String getString(byte[] bytes) { 
    StringBuffer sb = new StringBuffer(); 
    for (int i = 0; i < bytes.length; i++) { 
     byte b = bytes[i]; 
     String hex = Integer.toHexString((int) 0x00FF & b); 
     if (hex.length() == 1) { 
      sb.append("0"); 
     } 
     sb.append(hex); 
    } 
    return sb.toString(); 
} 

परिणाम php में परिणाम से अलग है ..

आप मेरी मदद कर सकते कृपया ?? अग्रिम धन्यवाद :)

उत्तर

5

आप seq20 सीधे उपयोग नहीं कर सकते परिवर्तित यह इतना स्ट्रिंग के बिना? मैं इसे इस तरह से करना होगा:

md.update(seq20); 
byte[] md5sum = md.digest(); 
BigInteger bigInt = new BigInteger(1, md5sum); 
output = bigInt.toString(16); 
while (output.length() < 32) { 
    output = "0"+output; 
} 
+0

आपको बहुत दोस्ताना धन्यवाद !!!!! यह जवाब है !!! घणी खम्मां! – fran

+2

@adves द्वारा उत्तर देखें। यह एक अच्छा सबक है: यदि आप इसकी मदद कर सकते हैं तो सामान्य समस्याओं के अपने समाधानों को न रोल करें, क्योंकि आपको अनिवार्य रूप से कुछ गलत मिलेगा। – amalloy

+0

@amalloy आपके संकेत के लिए धन्यवाद, मैंने तय किया है। – stacker

0

मेरा अनुमान है कि PHP ऊपर की ओर एक स्ट्रिंग के रूप में मूल्यांकन कर रहा है, हेक्स नहीं। और जब आप इसकी अपेक्षा करते हैं तो जावा ऐसा कर रहा है।

3

स्वीकार किए जाते हैं समाधान:

md.update(seq20); 
byte[] md5sum = md.digest(); 
BigInteger bigInt = new BigInteger(1, md5sum); 
output = bigInt.toString(16); 
if (output.length() == 31) { 
    output = "0"+output; 
} 

एक अंतर्गत प्रयोग किया कि 1/256 बार असफल हो जायेगी क्योंकि md5sum के उत्पादन में एक से अधिक शून्य अग्रणी हो सकता है शामिल हैं। एक उदाहरण md5 इनपुट जो इस त्रुटि को प्राप्त करेगा: "15446: 68106" (उद्धरण के बिना)।

यदि आप php कार्यान्वयन से मेल खाने वाले एमडी 5 की आवश्यकता है तो मैं apache commons DigestUtils.md5Hex का उपयोग करने की सलाह देता हूं।

5

अन्य दो जवाब में से कोई सकारात्मक गलत हैं, लेकिन एक लालित्य के दृष्टिकोण से विचार निम्नलिखित

String MD5(String... strings) { 
    MessageDigest md = null; 
    try { 
     md = MessageDigest.getInstance("MD5"); 
     for(final String s : strings) { 
      md.update(s.getBytes()); 
     } 
    } catch (NoSuchAlgorithmException ex) { 
     throw new RuntimeException("MD5 Cryptography Not Supported"); 
    } 
    final BigInteger bigInt = new BigInteger(1, md.digest()); 
    return String.format("%032x", bigInt); 
} 

संपादित करें:String... के उपयोग varargs पूरी तरह से वैकल्पिक है, लेकिन यह एक छोटे से समारोह में आता है आसान है, क्योंकि यह कॉलिंग फ़ंक्शन में स्ट्रिंग कॉन्सटेनेशन के ओवरहेड से बचाता है।

+3

मैंने अभी इस समाधान को लागू किया है और मुझे यह कहना है कि मुझे यह बहुत पसंद है। –

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