相同的BASE64编码的字符串用于不同的字节数组

时间:2020-05-17 02:08:55

标签: java oop hash

以下代码接受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编码的String。我不明白为什么?

2 个答案:

答案 0 :(得分:2)

来自Javadoc(我的重点):

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

您创建了TextInput,但从未读取任何内容。

答案 1 :(得分:1)

,但是似乎所有输出都具有相同的BASE64编码的String。我不 明白为什么吗?

由于源摘要字符串相同,因此您将在控制台上打印出相同的base64字符串。在对构造函数的所有5次调用中,源摘要字符串都是相同的,因为即使您正在读取文件,也并未真正对其内容进行任何操作。

您需要从文件创建的摘要输入流中获取消息摘要。

MessageDigest str = dis.getMessageDigest();
this.hash = Base64.getEncoder().encodeToString(str);
相关问题