js生成文件sha3值
1.引入jar包,本次使用的是sha3.js
地址:https://github.com/Caligatio/jsSHA
2.案例,为了校验文件是否重复,使用到了sha3,通过文件的开始2M+结束2M生成sha3值,然后加上文件大小,如果需要更加严谨,可以加上文件中间值截取2M。此案例中,如果文件小于截取大小,那么就不需要拼接上结束的2M。
问题:为什么不直接生成整个文件大小的sha3值?
如果生成整个文件的sha3值,就需要读取整个文件,那么文件一旦过大,那么前端读取耗时会很久,所以不考虑。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<script type="text/javascript" src="/sha3.js"></script>
<script type="text/javascript">
</head>
<body>
<p>
<input type="file" id="files" name="file" onchange="getSha3(this)" />
</p>
</body>
function getSha3(data) {
//创建读取文件
var fileReader = new FileReader();
//readAsArrayBuffer():开始读取指定的 Blob中的内容, 一旦完成, result 属性中保存的将是被读取文件的 ArrayBuffer 数据对象
//slice(0, 0*1024*1024):截取文件前2m
fileReader.readAsArrayBuffer(data.files[0].slice(0, 0*1024*1024));
//监听文件是否读取完
fileReader.onloadend = function (e) {
//判断是否已完成全部的读取请求.
if (e.target.readyState = FileReader.DONE) {
//"SHA3-512":可以设置为不同的Hash标准
//"ARRAYBUFFER":输入格式要根据fileReader读取的方式
var sha3 = new jsSHA("SHA3-512", "ARRAYBUFFER");
sha3.update(e.target.result);
//判断文件是否大于截取的大小
if (data.files[0].size > fileSliceSize) {
//创建读取文件
var endFileReader = new FileReader();
//截取结尾文件
endFileReader.readAsArrayBuffer(data.files[0].slice(data.files[0].size - 0*1024*1024, data.files[0].size));
//监听文件是否读取完
endFileReader.onloadend = function (e) {
//读取完成
if (e.target.readyState = FileReader.DONE) {
//将文件更新到sha3中,会在原有的截取文件开头末尾接上
sha3.update(e.target.result);
//获取sha3值加上文件大小
data.formData.sha3Id = sha3.getHash("HEX") + data.files[0].size;
}
};
} else {
//小于截取大小,不截取结尾文件
var timestamp_end = new Date().getTime();
//获取sha3值加上文件大小
var hex = sha3.getHash("HEX") + data.files[0].size;
}
}
</html>