Java实现文件校验

787 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

为什么需要生成哈希

在一些情况下我们需要知道两个文件是否一致,有没有发生变化,或者如日常使用的网盘应用,上传前需要对文件进行校验,避免多次存储相同的文件。

一般文件系统都提供了一种机制,可以在其文件上设置校验和。校验和是一种机制,用于文件的有效性证明,如果文件发生更改,此校验和将更改,从而让我们知道此文件不是同一文件,或者由于任何原因在传输之间文件发生损坏。

常见的是对文件进行校验和哈希,校验和哈希是对用户提供的内容应用某些算法和操作后获得的加密字符序列。

我们就来学习一下在Java中使用MD5和SHA-256为文件生成校验和哈希吧!

为文件生成校验和哈希

要为文件创建校验和,我们需要以块为单位逐字节读取文件的内容,然后使用给定的函数为其生成哈希。

此函数采用两个参数:

  • 消息摘要算法的实现
  • 需要为其生成校验和的文件

    private static String getFileChecksum(MessageDigest digest, File file) throws IOException
    {
        //获取文件输入流以读取文件内容
        FileInputStream fis = new FileInputStream(file);

        //创建字节数组以分块读取数据
        byte[] byteArray = new byte[1024];
        int bytesCount = 0;

        //读取文件数据并更新消息摘要
        while ((bytesCount = fis.read(byteArray)) != -1) {
            digest.update(byteArray, 0, bytesCount);
        };

        //获取哈希的字节
        byte[] bytes = digest.digest();

        //将 bytes[]转换为十六进制
        StringBuilder sb = new StringBuilder();
        for(int i=0; i< bytes.length ;i++)
        {
            sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
        }
        fis.close();
        return sb.toString();
    }

生成MD5哈希

    public static void main(String[] args) {
        File file = new File("D:\\myMD\\HooW.md");
        MessageDigest md5Digest = null;
        String checksum = null;
        try {
            // MD5哈希
            md5Digest = MessageDigest.getInstance("MD5");
            checksum = getFileChecksum(md5Digest, file);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(checksum);
    }

生成SHA-256哈希

        MessageDigest shaDigest = MessageDigest.getInstance("SHA-256");
        String shaChecksum = getFileChecksum(shaDigest, file);