Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CryptoJS SHA256大文件渐进校验和_Javascript_Hash_Sha256_Cryptojs_Chunking - Fatal编程技术网

Javascript CryptoJS SHA256大文件渐进校验和

Javascript CryptoJS SHA256大文件渐进校验和,javascript,hash,sha256,cryptojs,chunking,Javascript,Hash,Sha256,Cryptojs,Chunking,我正在尝试使用CryptoJS获取大文件(大于500MB)的校验和,这样浏览器就不会崩溃。我已经在使用一个具有分块功能的Web Worker。因此,当我迭代块来更新CryptoJS以开始创建校验和时,我尝试逐步使用每个块。然而,当我最终确定时,它仍然在最后返回错误的校验和。它似乎只返回最后一个块的校验和,而不是所有块的校验和。你能告诉我我做错了什么吗 此外,我不必使用CryptoJS,因为我发现它速度很慢,但它似乎是唯一一个可以处理渐进加密的库 var sha256 = CryptoJS.al

我正在尝试使用CryptoJS获取大文件(大于500MB)的校验和,这样浏览器就不会崩溃。我已经在使用一个具有分块功能的Web Worker。因此,当我迭代块来更新CryptoJS以开始创建校验和时,我尝试逐步使用每个块。然而,当我最终确定时,它仍然在最后返回错误的校验和。它似乎只返回最后一个块的校验和,而不是所有块的校验和。你能告诉我我做错了什么吗

此外,我不必使用CryptoJS,因为我发现它速度很慢,但它似乎是唯一一个可以处理渐进加密的库

 var sha256 = CryptoJS.algo.SHA256.create(),
     sha256Update,
     checksum = [],
     chunker = function(workerData) {                            

       var file = workerData.fileBlob,
           totalFileSize = file.size,
           chunkLength = 3145728,
           start = 0,
           stop = chunkLength,
           i = 0, readSlicer,
           fileSlicer,
           chunk,
           chunkUint8,
           timerCounter = 0,
           hashConvert;

      var checker = function() {

          start = stop;
          stop += chunkLength;

          if(start >= totalFileSize) {
               console.log("Done reading file!", stop, totalFileSize);
               sha256Update.finalize();

               console.log("CheckSum : ", sha256Update._hash.toString(CryptoJS.enc.Hex));
               return;
                               }
               readBlock(start, chunkLength, file);
      };

      var readBlock = function(start, chunkLength, file) {

          readSlicer = new FileReaderSync();
          fileSlicer = file.slice(start, stop + 1);

          chunk = readSlicer.readAsArrayBuffer(fileSlicer);
          chunkUint8 = new Uint8Array(chunk);
          var wordArr = CryptoJS.lib.WordArray.create(chunkUint8);
              sha256Update = sha256.update(wordArr);
              checksum.push(sha256Update);
              checker();

      };

          readBlock(start, chunkLength, file);
   };

我已经清理了上面的代码一点;有人可能会发现它很有用(这是经过测试的,工作正常):

从“crypto js”导入CryptoJS;
类校验服务{
异步sha256(文件:file):承诺{
设sha256=CryptoJS.algo.sha256.create();
常量切片大小=10_485_760;//10 MiB
让start=0;
while(开始{
const fileReader=new fileReader();
const slice=file.slice(开始,开始+大小);
fileReader.onload=()=>resolve(新的Uint8Array(fileReader.result as any));
fileReader.onerror=拒绝;
readAsArrayBuffer(切片);
});
}
}

你能提供一把小提琴吗?我没有试过,但可能是因为
fileSlicer=file.slice(start,stop+1)行中的
+1
。移除它。@ArtjomB。难道你不讨厌有什么东西盯着你的脸,而你却看不见吗?就这样!谢谢是的,我讨厌这个。我只是注意到了这一点,因为我为一个SO问题写了类似的东西。您的代码是否使用了上面建议的删除“+1”的修复程序?您是否能够优化或减少代码并使其符合typescript?