【问题标题】:why these two sources calculate different sha-1 sums为什么这两个来源计算不同的 sha-1 和
【发布时间】:2009-09-07 09:44:05
【问题描述】:

下面的 sn-ps 都应该计算 sha-1 sum。但是对于同一个文件,他们计算不同的 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();

你能解释一下原因吗?

【问题讨论】:

    标签: java sha1


    【解决方案1】:

    你的两个 sn-ps 都有问题:

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

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

    【讨论】:

    • read 中没有采用单个参数的方法 read。无论这是从哪里来的,它似乎都不是来自甚至编译过的代码。
    • Vinay:肯定有这样的方法。 BufferedInputStream is-a InputStream 具有该方法。
    【解决方案2】:

    你这里有一个错误:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-09
      • 2015-04-29
      相关资源
      最近更新 更多