【发布时间】:2014-01-04 06:19:36
【问题描述】:
我正在使用sjcl 在客户端对文件进行哈希处理,以便在开始完整上传之前检查它们是否存在于服务器上。
但是,它似乎有点慢。散列一个 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 文件,初始测试可以在不到一秒的时间内运行,但它仍然比我想要的慢。
【问题讨论】:
-
xxHash 宣传的速度相当惊人。
-
@JasonLeBrun:我现在正在尝试xxHash。它不会将
ArrayBuffer作为输入,这可能有问题。
标签: javascript performance hash