我需要为输入流(或文件)计算校验和,以检查文件内容是否已更改.我有以下代码,虽然我使用相同的流,但每次执行都会生成不同的值.有人可以帮我这么做吗?
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;
}
}
Run Code Online (Sandbox Code Playgroud)
您为两个调用使用相同的流对象 - 在您调用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)));
Run Code Online (Sandbox Code Playgroud)
请注意,您的异常处理checkSum 确实需要修复,以及您的十六进制转换...