Я использую sjcl для хэш-файлов на стороне клиента, чтобы я мог проверить, существуют ли они на сервере, прежде чем начать полную загрузку.Быстрое хеширование файлов больших файлов
Однако, это выглядит немного медленнее. Требуется около 15 секунд для хэша 8 Мбайт файла. Я не уверен, что это потому, что библиотека медленная, 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);
});
});
Edit: Просто обнаружил SparkMD5 согласно this answer. Первоначальные тесты показывают, что он работает в течение секунды для одного и того же 8 Мбайт файла, но он все еще медленнее, чем мне хотелось бы.
xxHash рекламирует довольно впечатляющие скорости. –
@JasonLeBrun: Сейчас я пытаюсь [xxHash] (https://github.com/pierrec/js-xxhash). Он не будет принимать «ArrayBuffer» в качестве входного сигнала, что может быть проблематичным. – mpen