2012-09-17 50 views
1

我已經編寫了以下函數來計算Java中的Md5校驗和。JAVA Md5返回非確定性結果

class Utils { 
public static String md5Hash(String input) { 
     String result = ""; 
     try { 
      System.out.println("Input=" + input); 
      final MessageDigest md = MessageDigest.getInstance("MD5"); 
      md.reset(); 
      md.update(input.getBytes()); 
      result = md.digest().toString(); 
     } catch (Exception ee) { 
      System.err.println("Error computing MD5 Hash"); 
     } 
     return result; 
    } 
}; 

調用Utils.md5Hash("abcde")多次給出了不同的結果。我的理解是,md5爲字符串返回一個確定性和唯一的校驗和。那是錯的嗎?否則,請讓我知道我的實施中的錯誤。謝謝

+0

重複http://stackoverflow.com/questions/415953/generate-md5-hash-in-java – Endy

+0

不是一個真正的重複。我實現了這個功能,並希望得到錯誤的幫助。那個人要求從頭開始實施。 – workwise

+0

@workwise所以你不需要從頭開始實施?在那種情況下,爲什麼你不使用apache庫通用摘要? 'org.apache.commons.codec.digest.DigestUtils'類具有很好的varios range md5 *函數的實現。 – user1516873

回答

7

字節數組的toString()方法不返回有意義的字符串。它返回數組對象的類型,接着是數組的hashCode。

如果要打印字節數組,則使用十六進制或Base64編碼將字節數組轉換爲字符串。 Apache commons-codec有辦法做到這一點。

此外,請確保指定支持任何種類字符的en編碼,以將字符串轉換爲字節數組。您使用的方法使用平臺默認編碼,例如,如果它是拉丁文-1,而您正在轉換非拉丁-1字符,則可能會失敗。 UTF-8是一個不錯的選擇。

+0

另外,在調用'input.getBytes()'時指定編碼,或者它可以在不同的系統上使用不同的默認編碼。 –

+0

+1你可以使用'result = Arrays.toString(md.digest());',儘管這不是非常緊湊並且沒有被廣泛使用。 –

+1

@JonSkeet:我在編輯你的評論時編輯了我的答案:-) –

1

我曾嘗試使用以下方式進行:

public static String encryptedLoginPassword(String password) 
    { 
     String encryptedData=""; 
    try{ 
     MessageDigest algorithm = MessageDigest.getInstance("MD5"); 
     byte[] defaultBytes = password.getBytes(); 
     algorithm.reset(); 
     algorithm.update(defaultBytes); 
     byte messageDigest[] = algorithm.digest(); 

     StringBuffer hexString = new StringBuffer(); 
     for (int i=0;i<messageDigest.length;i++) { 
      hexString.append(Integer.toHexString(0xFF & messageDigest[i])); 
     } 
     encryptedData=hexString.toString(); 
    }catch(NoSuchAlgorithmException nsae){ 

    } 
    return encryptedData; 
    } 
0

INT由Dinup坎德爾給出的代碼,我不得不改變這一點:

for (int i=0;i<messageDigest.length;i++) { 
    hexString.append(Integer.toHexString(0xFF & messageDigest[i])); 
} 

if ((0xff & messageDigest[i]) < 0x10) { 
    hexString.append("0" 
    + Integer.toHexString((0xFF & messageDigest[i]))); 
} else { 
    hexString.append(Integer.toHexString(0xFF & messageDigest[i])); 
} 

到讓我的單元測試工作。

注:我用它來驗證正確答案:

echo -n MyTestString | md5sum