为什么我的两个MD5哈希方法产生不同的哈希?

时间:2012-03-22 19:24:55

标签: java utf-8 md5 message-digest

我是java的新手,真的需要一些帮助。我创建了一个命令行工具,以获取文件的MD5哈希值。这工作,所以我然后我的代码定制,以GUI形式。这两个程序给出了同一文件的不同哈希值,令人困惑。我已经研究过UTF-8,但据我所知,这只适用于字符串而不是文件实例。谁能告诉我为什么他们提供不同的哈希值并指出我正确的方向?

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

    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);

}

2 个答案:

答案 0 :(得分:1)

您只能从流中进行一次读取调用。你需要在读取InputStream时循环(假设你想要读取你通常想要的整个东西)。另外,你似乎使用相同的字节对digest.update()进行2次调用。

另外,通常在打印哈希值时,因为它是二进制值,所以使用base64编码打印。

答案 1 :(得分:0)

除了@ jtahlborn的评论之外,你不需要在这两种方法中进行md.update(databytes);调用,而你的第二种方法应该在最后:{/ p>

BigInteger bigInt = new BigInteger(1, MD5checksum);

第一种方法不会对digest()进行第二次调用,当你调用update()时,其值会发生变化