MessageDigest 的两种更新方法之间的真正区别是什么?

The real difference between the MessageDigest`s two update methods?

示例一:

FileInputStream fis = new FileInputStream(path);
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
  digest.update(buffer, 0, len);
}
BigInteger bigInt = new BigInteger(1, digest.digest());
return  bigInt.toString(16);

例子二:

FileInputStream fis = new FileInputStream(path);
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] buffer = new byte[1024];
while ((fis.read(buffer)) != -1) {
  digest.update(buffer);
}
BigInteger bigInt = new BigInteger(1, digest.digest());
return  bigInt.toString(16);

在上面两个例子中,我使用了两种不同的更新方式。当我传递相同的文件路径时,这两个操作return 两个不同的结果。 update方法是append模式吗?为什么我得到不同的结果?

第一个有效,第二个无效。 read 不一定填满缓冲区,但在第二个示例中,您始终将所有字节发送到摘要。