【发布时间】:2020-07-10 05:35:37
【问题描述】:
我正在尝试使用 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);
};
【问题讨论】:
-
你能提供一个小提琴吗?
-
我没有尝试过,但可能是因为
fileSlicer = file.slice(start, stop + 1);行中的+1。删除它。 -
@ArtjomB。你不讨厌有什么东西正盯着你看而你看不到吗?就是这样!谢谢!
-
是的,我讨厌这个。我只注意到这一点,因为我为一个 SO 问题写了这样的东西。
-
您的代码是否可以使用上面建议的删除“+ 1”的修复方法?您是否能够优化或减少代码并使其符合打字稿?
标签: javascript hash sha256 cryptojs chunking