java - Java 如何计算文件的哈希值?

标签 java arrays file-io hash

<分区>

我编写了以下程序来计算 Java 中字符串的 SHA-256 哈希值:

public class ToHash {

    public static void main(String[] args)  {

        byte[] data = "test".getBytes("UTF8");
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(data);
        System.out.println(new BASE64Encoder().encode(hash));

    }
}

嗯,这很好用。在下一步中,我想以一种接受文件并计算其哈希值的方式开发它。我的解决方案是读取字符串数组中的整个文件,然后对该字符串数组调用 digest() 方法。但是有两个问题:

  1. 我不知道如何将整个文件读入数组?目前我认为我必须逐行阅读它并用新行附加一个数组!

  2. 以上方法对于大文件需要大量内存!


这是我当前读取文件的程序:

public class ToHash {

    public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException, FileNotFoundException, IOException {
        // TODO code application logic here

        // The name of the file to open.
        String fileName = "C:\\Users\\ghasemi\\Desktop\\1.png";
        BufferedReader br = null;

        try {

            String sCurrentLine;
            br = new BufferedReader(new FileReader(fileName));
            while ((sCurrentLine = br.readLine()) != null) {
                byte[] data = sCurrentLine.getBytes("UTF8");
                System.out.println(new BASE64Encoder().encode(data));
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (br != null) {
                    br.close();
                }
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }

    }
}

BufferedReader 对象似乎没有一次调用读取整个文件的方法。

最佳答案

您可以边读文件边计算哈希值。

    byte[] buffer= new byte[8192];
    int count;
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName));
    while ((count = bis.read(buffer)) > 0) {
        digest.update(buffer, 0, count);
    }
    bis.close();

    byte[] hash = digest.digest();
    System.out.println(new BASE64Encoder().encode(hash));

这不会假设任何有关字符集或文件适合内存的信息,也不会忽略行终止符。

或者您可以使用 DigestInputStream。

关于java - Java 如何计算文件的哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32032851/

相关文章:

java - 如何解析从周/年到dd/mm/yyyy

java - 遵循有关此问题的建议后,在 Mac 上仍然有 Eclipse EE 404

PHP 将数组传递给函数 - 如果未设置则保持默认值

C-从文件中将整数和字符读入数组

c# - 使用 .NET 附加到大文件时如何避免过多的网络文件 I/O?

java - 我如何在 Micronaut/Kotest/Hibernate 测试中出现 "obtain transaction-synchronized Session for current thread"

java - 在构造函数中自分配对象其子对象

php - 一定指数后停止 explode

python - 在 Python 中将多个字符串写入 CSV 文件

java - 从 Java 文本文件中删除特定行?