gpt4 book ai didi

java - 计算输入流的校验和

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:57 24 4
gpt4 key购买 nike

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

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

最佳答案

两次调用都使用相同的流 object - 在调用一次 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com