java - 不同字节数组的相同 BASE64 编码字符串
问题描述
下面的代码接受一个 File 对象并使用它创建一个 BasicFile 对象。
package code.CustomFiles.File;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class BasicFile {
public String hash;
public File file;
BasicFile(File f){
file = f;
try{
compute_hash();
}catch(NoSuchAlgorithmException e){
this.hash = "NOSUCHALGO";
}
}
BasicFile(String filename, long size, String hash) throws IOException {
File f = new File(filename);
f.createNewFile();
RandomAccessFile r = new RandomAccessFile(f,"rw");
r.setLength(size);
r.close();
this.file=f;
this.hash=hash;
}
public void compute_hash() throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
try(InputStream is = Files.newInputStream(file.toPath());
DigestInputStream dis = new DigestInputStream(is,md)){
}catch (IOException e) {
e.printStackTrace();
}
byte[] digest = md.digest();
this.hash = Base64.getEncoder().encodeToString(digest);
System.out.println(digest+" "+hash);
}
public String toString(){
return "Filepath: "+file+"\nHash: "+hash+"\n";
}
}
多次调用BasicFile(File)
构造函数的输出:-
[B@3abe666c 1B2M2Y8AsgTpgAmY7PhCfg==
[B@61e4d4fe 1B2M2Y8AsgTpgAmY7PhCfg==
[B@7dd92a4a 1B2M2Y8AsgTpgAmY7PhCfg==
[B@349dbe9b 1B2M2Y8AsgTpgAmY7PhCfg==
[B@6446bac9 1B2M2Y8AsgTpgAmY7PhCfg==
[B@23c2c19b 1B2M2Y8AsgTpgAmY7PhCfg==
[B@177d34d3 1B2M2Y8AsgTpgAmY7PhCfg==
[B@4ecd39c1 1B2M2Y8AsgTpgAmY7PhCfg==
我正在使用BasicFile(File)
构造函数创建多个 BasicFile 对象,但所有对象似乎都具有相同的 BASE64 编码字符串作为输出。我不明白为什么?
解决方案
来自 Javadoc(我的重点):
要完成消息摘要计算,请在调用此摘要输入流的读取方法之一之后调用相关消息摘要的摘要方法之一。
您创建DigestInputStream
但从未从中读取任何内容。
推荐阅读
- xamarin - Xamarin WebView 有时不会在 UWP 中显示
- css - 如何使用 Internet Explorer 11 开发人员工具检查伪元素
- javascript - 如何以角度重置ng-select
- python-3.x - 在文本文件中按升序排列
- performance - 节点上的 Spark 分区 foreachpartition
- java - 使用哪个 HTTP 动词来触发 Kafka 消息的发布
- sql - T SQL Cte delete where group by 大于 1
- node.js - Angular 和 Nodejs 基本文件下载
- r - 从长格式表计算用户会话:直接方法的性能问题
- python - 检查角度是否落入圆形置信区间的优雅(最有效)方法