2

以下片段都应该计算 sha-1 总和。但是对于同一个文件,他们计算不同的 sha-1 总和。

//snippet1
byte[] byteArr = new byte[(int) uploadedFile.getLength()];
try {
 stream = new BufferedInputStream(uploadedFile.getInputStream());
 stream.read(byteArr);
 stream.close(); 
} catch (IOException e) {
 e.printStackTrace();
}
md = MessageDigest.getInstance("SHA-1"); 
byte[] sha1hash = new byte[40];
md.update(byteArr, 0, byteArr.length);
sha1hash = md.digest();

//snippet2
md = MessageDigest.getInstance("SHA-1");
InputStream is = uploadedFile.getInputStream();
try {
 is = new DigestInputStream(is, md);
} finally {
 try {
  is.close();
 } catch (IOException e) {
  e.printStackTrace();
 }
}
sha1hash = md.digest();

你能解释一下为什么吗?

4

2 回答 2

12

你的两个片段都是错误的:

  • 第一个片段从文件中读取一些(实际上是随机的)字节,并不能保证读取整个文件(阅读JavaDoc 以read()获取详细信息)。

  • 第二个片段根本不从 InputStream 读取任何内容,因此返回空流的 SHA-1(读取 0 字节)。

于 2009-09-07T09:49:49.457 回答
3

你这里有一个错误:

 stream = new BufferedInputStream(uploadedFile.getInputStream());
 stream.read(byteArr);
 stream.close(); 

read()方法不会自动填充传递给它的数组 - 它会读取任意数量的字节并返回该数字。您必须循环并累加返回的字节数,直到数组被填满。

几乎每个人第一次都犯了这个错误,但这是基于输入流的方法更好的原因之一(另一个是对于大文件,您绝对不想将它们完全保存在内存中)。

于 2009-09-07T09:50:39.370 回答