2011-10-15 129 views
9

http://www.anyexample.com/programming/java/java_simple_class_to_compute_md5_hash.xml給出了一個如何計算String的MD5哈希的例子。這會產生一個20位數的十六進制字符串。根據http://en.wikipedia.org/wiki/MD5我期望一個32位十六進制字符串。例如,在How can I generate an MD5 hash?中使用dac2009響應的結果相同。Java計算MD5哈希

爲什麼我會得到一些看起來像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

請發佈一個簡短的示例(完整)代碼來說明您遇到的問題。沒有這一點,我們不能告訴你你做錯了什麼:)在你鏈接到的StackOverflow問題中描述的方法是如何生成一個MD5散列,其確實是32個十六進制字符 –

+0

第一個鏈接在這裏工作... – AndyAndroid

回答

3

代碼你鏈接的例子,在我看來是錯誤的代碼。它看起來像作者不知道電腦是如何工作的。但是,有更好的例子。

的最後一個例子是,你正在尋找的人。再檢查一下這個Ideone: http://ideone.com/ZeN8a


更新0:我從來沒有格式化字符串("%1$032X")的這種方式見過的,所以我不知道它做什麼。您需要128位來表示MD5散列,我建議使用BigInteger本身的toString(16)方法來創建BigInteger的字符串表示形式,而不是使用該格式。

String hashtext = bigInt.toString(16); 

更新1:我真的不知道了什麼是錯與所提供的代碼。試試這個:

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

如果仍然會產生20位數字,請嘗試重新安裝Java。我失去了靈感。

+0

我做了什麼是在第一個鏈接 - > 20個字符,我看了第二個鏈接 - >對該帖子的評論:它忽略尾隨空白。所以這兩種方法似乎都沒問題。你是否成功運行這些? – AndyAndroid

+0

好吧我把我的return語句改爲「return i.toString(16);」。我仍然得到相同的結果。 20位數字。你運行的代碼,並獲得32位數字? – AndyAndroid

+0

重新安裝是不可能的,它在Android手機上運行,​​但你是對的我試着在一個普通的桌面java安裝,它有32位數字。也許是Android中的一個錯誤。感謝你的幫助。 – AndyAndroid

40

使用org.apache.commons.codec.digest.DigestUtils,反而採取:

DigestUtils.md5Hex(str); 

這會給你32字符字符串作爲結果

+2

,因爲它是一個移動應用程序我不想使用任何額外的軟件包,而是留在「普通的Java」。 – AndyAndroid

+5

題目標題誤導,因爲沒有提及移動。例如這個答案對我來說是有用的和簡單的,因爲我搜索了一個簡單的java例子。這個答案對我來說是完美的:) – sarkiroka

+1

@sarkiroka如果標題/標籤提到「移動」,你可能沒有嘗試打開此頁面。如果OP不喜歡具體的答案,他有權這樣做。無需將其視爲犯罪。 :) – Sufian

1

我試過上面的例子,MungPass(「java」),我得到了一個32位字符串, 93f725a07423fe1c889f448b33d21f46。既然你在跑步的時候得到了20個正確的第一個,我猜你在打印輸出中只是缺少一些東西?