我需要计算输入流(或文件)的校验和,以检查文件内容是否已更改。我使用下面的代码,尽管我使用相同的流,但每次执行都会生成不同的值。有人可以帮我做对吗?

public class CreateChecksum {
    public static void main(String args[]) {
        String test = "Hello world";
        ByteArrayInputStream bis = new ByteArrayInputStream(test.getBytes());
        System.out.println("MD5 checksum for file using Java : "    + checkSum(bis));
        System.out.println("MD5 checksum for file using Java : "    + checkSum(bis));
    }
    public static String checkSum(InputStream fis){
        String checksum = null;
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            //Using MessageDigest update() method to provide input
            byte[] buffer = new byte[8192];
            int numOfBytesRead;
            while( (numOfBytesRead = fis.read(buffer)) > 0){
                md.update(buffer, 0, numOfBytesRead);
            }
            byte[] hash = md.digest();
            checksum = new BigInteger(1, hash).toString(16); //don't use this, truncates leading zero
        } catch (Exception ex) {
        }
       return checksum;
    }
}

最佳答案

您在两个调用中都使用了相同的流对象-一次调用checkSum后,该流将不再需要读取任何数据,因此第二个调用将创建一个空流的哈希。最简单的方法是每次创建一个新的流:

String test = "Hello world";
byte[] bytes = test.getBytes(StandardCharsets.UTF_8);
System.out.println("MD5 checksum for file using Java : "
    + checkSum(new ByteArrayInputStream(bytes)));
System.out.println("MD5 checksum for file using Java : "
    + checkSum(new ByteArrayInputStream(bytes)));

请注意,您在checkSum中的异常处理确实需要修复以及十六进制转换...

关于java - 计算输入流的校验和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24866580/

10-09 08:37