2012-03-22 106 views
1

我是新來的java,真的需要一些幫助。我創建了一個命令行工具來獲取文件的MD5哈希。這工作,所以我然後量身定製我的代碼,把它放在GUI的形式。這兩個程序給出了相同文件的不同哈希,這是令人困惑的。我已經研究過UTF-8,但據我所知只能用於字符串而不是文件實例。任何人都可以告訴我他們爲什麼提供不同的哈希值並指向正確的方向嗎?爲什麼我的兩個MD5哈希方法產生不同的哈希?

第一種方法(命令行)...

public static void main(String args[]) throws IOException, NoSuchAlgorithmException { 

    System.out.println("Please enter file path: \n"); 

    BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); 
    String dir = stdin.readLine(); 
    File file = new File(dir); 

    FileInputStream iStream = null; 

    try {iStream = new FileInputStream(file);} 
    catch (FileNotFoundException e) {  
     String MD5Output = "There has been an error: " + e.toString(); 
    } 

    byte[] dataBytes = new byte[1024]; 

    MessageDigest md = MessageDigest.getInstance("MD5"); 

    int numRead = iStream.read(dataBytes); 
     md.update(dataBytes, 0, numRead); 

     iStream.close(); 

     dataBytes = md.digest(); 

    md.update(dataBytes); 
    System.out.println("MD5: " + new BigInteger(1, md.digest()).toString(16)); 

} 

二法(GUI建)...

public void doMD5() throws IOException, NoSuchAlgorithmException { 

    File file = new File(jTxtMD51.getText()); 

    FileInputStream iStream = null; 

    try {iStream = new FileInputStream(file);} 
    catch (FileNotFoundException e) {  
     String MD5Output = "There has been an error: " + e.toString(); 
    } 

    byte[] dataBytes = new byte[1024]; 

    MessageDigest md = MessageDigest.getInstance("MD5"); 

    int numRead = iStream.read(dataBytes); 
     md.update(dataBytes, 0, numRead); 

     iStream.close(); 

     byte[] MD5checksum = md.digest(); 

    md.update(dataBytes); 

    BigInteger bigInt = new BigInteger(1, md.digest()); 
    String MD5Hash = bigInt.toString(16); 

    jTextOutput.append("MD5 is : " + MD5Hash); 

} 

回答

1

你只能讓從流讀取一個電話。讀取InputStream時需要循環(假設您想讀取所有您想要的東西)。此外,您似乎使用相同的字節對digest.update()進行了2次調用。

此外,通常當打印散列值時,由於它是二進制值,因此使用base64編碼打印。

0

除了@ jtahlborn的評論,你並不需要在這兩種方法中md.update(databytes);呼叫,並且你的第二個方法應該在結尾有這樣的:

BigInteger bigInt = new BigInteger(1, MD5checksum); 

你第一種方法不這樣做第二調用摘要(),當您調用update()時,其值會更改()