2012-03-22 96 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()时,其值会更改()