检查文件的MD5

时间:2013-07-02 06:03:56

标签: java android md5

我在尝试检查文件的MD5哈希时遇到错误。

文件notice.txt包含以下内容:

My name is sanjay yadav . i am in btech computer science .>>

当我使用onlineMD5.com在线查看时,它将MD5指定为:90F450C33FAC09630D344CBA9BF80471

我的节目输出是:

My name is sanjay yadav . i am in btech computer science .
Read 58 bytes
d41d8cd98f00b204e9800998ecf8427e

这是我的代码:

import java.io.*;
import java.math.BigInteger;
import java.security.DigestException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

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

        FileInputStream inputstream = null;
        byte[] mybyte = new byte[1024];

        inputstream = new FileInputStream("e://notice.txt");
        int total = 0;
        int nRead = 0;
        MessageDigest md = MessageDigest.getInstance("MD5");
        while ((nRead = inputstream.read(mybyte)) != -1) {
            System.out.println(new String(mybyte));
            total += nRead;
            md.update(mybyte, 0, nRead);
        }

        System.out.println("Read " + total + " bytes");
        md.digest();
        System.out.println(new BigInteger(1, md.digest()).toString(16));
    }
}

2 个答案:

答案 0 :(得分:1)

你的代码中存在一个错误我认为在线工具给出了错误的答案。在这里,您目前正在计算摘要两次:

md.digest();
System.out.println(new BigInteger(1, md.digest()).toString(16));

每次拨打digest()时,都会重置内部状态。您应该删除对digest()的第一次通话。然后,这将留下你的摘要:

2f4c6a40682161e5b01c24d5aa896da0

这与我从C#获得的结果相同,我认为这是正确的。我不知道为什么在线检查员给出的结果不正确。 (如果将其放入同一站点的 text 部分,则会得到正确的结果。)

您的代码还有其他几点:

  • 在将字节转换为字符串时,您当前正在使用平台默认编码。我强烈反对你这样做。
  • 您目前正在将整个缓冲区转换为字符串,而不是只读取您读过的位。
  • 我不喜欢使用BigInteger作为将二进制数据转换为十六进制的方法。您可能需要用0填充它,它基本上不是该类的设计目的。使用专用的十六进制转换类,例如来自Apache Commons Codec(或各种Stack Overflow答案,为此目的提供独立的类)。
  • 您没有关闭输入流。您应该在finally块中执行此操作,或在Java 7中使用try-with-resources语句。

答案 1 :(得分:0)

我使用这个功能:

public static String md5Hash(File file) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        InputStream is = new FileInputStream(file);
        byte[] buffer = new byte[1024];

        try {
            is = new DigestInputStream(is, md);

            while (is.read(buffer) != -1) { }
        } finally {
            is.close();
        }

        byte[] digest = md.digest();

        BigInteger bigInt = new BigInteger(1, digest);
        String output = bigInt.toString(16);
        while (output.length() < 32) {
            output = "0" + output;
        }

        return output;
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}