javascript - SHA256 使用 Filereader 问题以 Angular 6 散列大文件

标签 javascript angular typescript sha256 cryptojs

我对 SHA256 哈希有疑问。如果文件大小超过 250 MB,它将终止浏览器并崩溃。 下面是哈希码,请帮助我们。

let fileReader = new FileReader();
fileReader.readAsArrayBuffer(fileToSend);

  fileReader.onload = (e) => {
  const hash = CrypTo.SHA256(this.arrayBufferToWordArray(fileReader.result)).toString();
  this.hashCode=hash;
  this.fileHistory.MediaHash = hash;
  this.fileHistory.FileName = fileToSend.name;

  //Insert to file history
  this.fileHistoryService.postFiles(this.fileHistory).subscribe(
    data => {
      this.hashCode=data["MediaHash"];
      this.alertService.success('HASHFILE.FileUploadSuccessMessage', true);
      this.hideGenerateHashCodeButton = true;
    },
    error => {
       this.alertService.error('COMMONERRORMESSAGE.SomethingWentWrongErrorMessage');
  });

}

arrayBufferToWordArray(fileResult) {
    var i8a = new Uint8Array(fileResult);
    var byteArray = [];
    for (var i = 0; i < i8a.length; i += 4) {
      byteArray.push(i8a[i] << 24 | i8a[i + 1] << 16 | i8a[i + 2] << 8 | i8a[i + 3]);
    }
    return CrypTo.lib.WordArray.create(byteArray, i8a.length);
  }

最佳答案

下面的代码我测试了所有大文件,这修复了我的解决方案。

var hashdata = CrypTo.algo.SHA256.create();
      var file =**<FiletoHash>**;
          if(file){
            var reader = new FileReader();
            var size = file.size;
            var chunk_size = Math.pow(2, 22);
            var chunks = [];

            var offset = 0;
            var bytes = 0;
        reader.onloadend = (e) =>{
              if (reader.readyState == FileReader.DONE){

               //every chunk read updating hash
                hashdata.update(this.arrayBufferToWordArray(reader.result));

                let chunk:any = reader.result;
                bytes += chunk.length;
                chunks.push(chunk);
                if((offset < size)){
                  offset += chunk_size;
                  var blob = file.slice(offset, offset + chunk_size);
                  reader.readAsArrayBuffer(blob);
                } else {
                  //use below hash for result
                  //finaly generating hash
                  var hash = hashdata.finalize().toString();

                 //debugger;
                };
              }
            };
            var blob = file.slice(offset, offset + chunk_size);
            reader.readAsArrayBuffer(blob);
          }

    }
  }

  arrayBufferToWordArray(fileResult) {
    var i8a = new Uint8Array(fileResult);
    return CrypTo.lib.WordArray.create(i8a, i8a.length);
  }

关于javascript - SHA256 使用 Filereader 问题以 Angular 6 散列大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60004467/

相关文章:

使用 typescript 的 Mongoose 模式/模型

javascript - 将十进制转换为十六进制缺少填充的 0

javascript - Highcharts 卡在平移上

angular - 在路由解析器中调用嵌套的 http 返回 Observable 而不是数据

javascript - 使用 TypeScript 简化 JavaScript 代码

javascript - 'string' 类型的参数不可分配给 'AbstractControl' 类型的参数。 Angular react 形式

javascript - 我可以将 service worker 与 socket-io 一起使用吗?

javascript - 在 select 中选择一个选项时的事件名称

Angular Material 步进器标题线样式

angular - karma 报应中的 lcov.info 文件, Angular 未生成