js生成文件sha3值

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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值