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

我编写了以下程序来计算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.