MessageDigest 为同一文件提供两个不同的哈希值
MessageDigest gives two differents hash for a same file
我正在使用 MessageDigest 使用 SHA 256 对文件进行哈希处理,如下所示:
byte[] hash = new byte[32];
MessageDigest digest = MessageDigest.getInstance("SHA-256");
try (InputStream input = Files.newInputStream( Paths.get(file.getPath()) )) {
byte[] buf = new byte[8192];
int len;
while ( (len=input.read(buf)) > 0 ) {
digest.update(buf, 0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
hash = digest.digest();
"simplified" 的想法是:我对一个文件进行哈希处理,只取前两个字节,将它发送到两个服务器;服务器查看他的 DB ob 他已经有了这个 "shorthash" (我的意思是,两个字节)。如果是,则不允许客户端发送该文件,该文件将以简码形式保存在数据库中。
问题是:如果我给同一个文件两次,它不会给我相同的散列。我不知道为什么。
感谢罗伯特,这似乎只是一个打印问题。
我以这种方式打印它并得到两个以 B@ 开头的奇怪字符串:
System.out.println(hash);
通过这种方式,我得到了两个完全相同的 int 数组:
System.out.println(Arrays.toString(hash))
现在我只需要找出为什么我的数据库看不到它们是相同的。由于这可能是由于 SQL 声明,因此不再是主题。
我正在使用 MessageDigest 使用 SHA 256 对文件进行哈希处理,如下所示:
byte[] hash = new byte[32];
MessageDigest digest = MessageDigest.getInstance("SHA-256");
try (InputStream input = Files.newInputStream( Paths.get(file.getPath()) )) {
byte[] buf = new byte[8192];
int len;
while ( (len=input.read(buf)) > 0 ) {
digest.update(buf, 0, len);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
hash = digest.digest();
"simplified" 的想法是:我对一个文件进行哈希处理,只取前两个字节,将它发送到两个服务器;服务器查看他的 DB ob 他已经有了这个 "shorthash" (我的意思是,两个字节)。如果是,则不允许客户端发送该文件,该文件将以简码形式保存在数据库中。
问题是:如果我给同一个文件两次,它不会给我相同的散列。我不知道为什么。
感谢罗伯特,这似乎只是一个打印问题。 我以这种方式打印它并得到两个以 B@ 开头的奇怪字符串:
System.out.println(hash);
通过这种方式,我得到了两个完全相同的 int 数组:
System.out.println(Arrays.toString(hash))
现在我只需要找出为什么我的数据库看不到它们是相同的。由于这可能是由于 SQL 声明,因此不再是主题。