java和js计算文件的SHA-256哈希值

需求

需要做分片上传,需要在分片合成文件之后校验这个合成的文件是否和上传的一直,具体就是对文件取hash值,于是选择SHA-256取文件哈希值,自己测试之后没问题,特此分享

前端js下使用SHA-256取文件文件哈希值,代码如下:

// 定义一个函数,用于计算文件的SHA-256哈希值
	calculateFileHash(file) {
	  // 创建一个FileReader对象,用于读取文件内容
	  const reader = new FileReader();
	  
	  // 为FileReader对象设置onload事件处理函数
	  // 当文件读取完成时,此函数将被调用
	  reader.onload = (e) => {
	    // 获取文件内容,存储在e.target.result中
	    const buffer = e.target.result;
	    
	    // 使用Web Crypto API的crypto.subtle.digest方法计算SHA-256哈希值
	    // 'SHA-256'是指定的哈希算法,buffer是要计算哈希的文件数据
	    const digestOp = crypto.subtle.digest('SHA-256', buffer);
	    
	    // 当哈希计算完成时,处理Promise对象
	    digestOp.then((hashBuffer) => {
	      // 将哈希值的ArrayBuffer转换为Uint8Array
	      const hashArray = Array.from(new Uint8Array(hashBuffer));
	      
	      // 将每个字节转换为十六进制字符串,并确保每两个字符为一组,不足两位前面补零
	      const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
	      
	      // 打印计算出的哈希值
	      console.log(hashHex);
	    }).catch((error) => {
	      // 如果在计算哈希值过程中出现错误,打印错误信息
	      console.error('Error calculating hash:', error);
	    });
	  };
	  
	  // 以ArrayBuffer格式读取文件内容
	  // 这将触发onload事件,当读取操作完成时
	  reader.readAsArrayBuffer(file);
	},

java使用SHA-256取文件哈希值,代码如下:

public class FileHashCalculator {
    // 计算并返回指定文件的SHA-256哈希值
    public static String calculateSHA256(File file) throws IOException, NoSuchAlgorithmException {
        // 获取MessageDigest的实例,并指定使用SHA-256算法
        MessageDigest digest = MessageDigest.getInstance("SHA-256");

        // 使用try-with-resources语句自动关闭FileInputStream
        try (FileInputStream fis = new FileInputStream(file)) {
            // 创建一个1024字节的缓冲区
            byte[] byteArray = new byte[1024];
            // 读取文件内容到缓冲区
            int bytesCount = 0;
            while ((bytesCount = fis.read(byteArray)) != -1) {
                // 更新MessageDigest对象,传入实际读取的字节数
                digest.update(byteArray, 0, bytesCount);
            }
        }
        // 计算哈希值
        byte[] bytes = digest.digest();

        // 将哈希值转换为十六进制字符串
        StringBuilder sb = new StringBuilder();
        for (byte aByte : bytes) {
            // 将每个字节转换为十六进制并添加到字符串构建器中
            sb.append(Integer.toString((aByte & 0xff) + 0x100, 16).substring(1));
        }
        // 返回生成的哈希值字符串
        return sb.toString();
    }

    // 主方法,用于测试calculateSHA256方法
    public static void main(String[] args) {
        // 创建File对象,指向要计算哈希值的文件
        File file = new File("D:\\javaTools\\tools\\elasticSearch\\elasticsearch-7.17.3-windows-x86_64.zip");
        try {
            // 调用calculateSHA256方法计算文件的哈希值
            String hash = calculateSHA256(file);
            // 打印计算出的哈希值
            System.out.println("SHA-256 Hash: " + hash);
        } catch (IOException | NoSuchAlgorithmException e) {
            // 打印可能发生的异常信息
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诸葛博仌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值