为什么这两个来源计算不同的sha-1总和

时间:2009-09-07 09:44:06

标签: java sha1

以下片段都应该计算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();

你能解释一下原因吗?

2 个答案:

答案 0 :(得分:12)

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

  • 第一个剪辑从文件中读取一些(实际上是随机的)字节数,并且无法保证读取整个文件(有关详细信息,请阅读JavaDoc of read())。

  • 第二个剪辑不会从InputStream中读取任何内容,因此会返回空流的SHA-1(读取0个字节)。

答案 1 :(得分:3)

你有一个错误:

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

read()方法自动填充传入其中的数组 - 它将读取任意数量的字节并返回该数字。您必须循环并添加返回的字节数,直到数组被填满。

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