首页 > 解决方案 > 不同字节数组的相同 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 编码字符串作为输出。我不明白为什么?

标签: javaoophash

解决方案


来自 Javadoc(我的重点):

要完成消息摘要计算,请在调用此摘要输入流的读取方法之一之后调用相关消息摘要的摘要方法之一。

您创建DigestInputStream但从未从中读取任何内容。


推荐阅读