我正在使用sjcl对文件进行客户端哈希,以便在开始完整上传之前检查它们是否存在于服务器上。
然而,这个过程似乎有点慢。对一个8 MB的文件进行哈希需要大约15秒钟。我不确定是因为库本身慢,JavaScript本身慢,还是算法本身就慢。它使用了sha256,这可能对我所需的功能来说有些过度。速度很重要--加密安全性和冲突并不特别重要。
有更快的方法吗?
编辑:根据this answer,我刚刚发现SparkMD5。 初步测试表明,对于相同的8 MB文件,它可以在不到一秒的时间内运行,但速度仍然比我想要的慢。
然而,这个过程似乎有点慢。对一个8 MB的文件进行哈希需要大约15秒钟。我不确定是因为库本身慢,JavaScript本身慢,还是算法本身就慢。它使用了sha256,这可能对我所需的功能来说有些过度。速度很重要--加密安全性和冲突并不特别重要。
有更快的方法吗?
$(document).on('drop', function(dropEvent) {
dropEvent.preventDefault();
_.each(dropEvent.originalEvent.dataTransfer.files, function(file) {
var reader = new FileReader();
var pos = 0;
var startTime = +new Date();
var hashObj = new sjcl.hash.sha256();
reader.onprogress = function(progress) {
var chunk = new Uint8Array(reader.result).subarray(pos, progress.loaded);
hashObj.update(chunk);
pos = progress.loaded;
if(progress.lengthComputable) {
console.log((progress.loaded/progress.total*100).toFixed(1)+'%');
}
};
reader.onload = function() {
var endTime = +new Date();
console.log('hashed',file.name,'in',endTime-startTime,'ms');
var chunk = new Uint8Array(reader.result, pos);
if(chunk.length > 0) hashObj.update(chunk);
console.log(sjcl.codec.hex.fromBits(hashObj.finalize()));
};
reader.readAsArrayBuffer(file);
});
});
编辑:根据this answer,我刚刚发现SparkMD5。 初步测试表明,对于相同的8 MB文件,它可以在不到一秒的时间内运行,但速度仍然比我想要的慢。
ArrayBuffer
作为输入,这可能会有问题。 - mpen