需求
需要做分片上传,需要在分片合成文件之后校验这个合成的文件是否和上传的一直,具体就是对文件取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();
}
}
}