分段计算的
const CryptoJS = require('crypto-js');
/* 分段读取文件 */
function readBinaryChunked(file, chunkCallback, endCallback) {
const fileSize = file.size;
const chunkSize = 4 * 1024 * 1024; // 4MB
let offset = 0;
const reader = new FileReader();
reader.onload = () => {
if (reader.error) {
endCallback(reader.error || {});
return;
}
offset += reader.result.byteLength;
try {
chunkCallback(reader.result, offset, fileSize);
} catch (err) {
endCallback(err);
return;
}
if (offset >= fileSize) {
endCallback(null);
return;
}
readNext();
};
reader.onerror = (err) => {
endCallback(err || {});
};
function readNext() {
const fileSlice = file.slice(offset, offset + chunkSize);
reader.readAsArrayBuffer(fileSlice);
}
readNext();
}
/* 调用 CryptoJS 计算 MD5, cbProgress 用于控制进度条*/
function getMD5(blob, cbProgress) {
return new Promise((resolve, reject) => {
const md5 = CryptoJS.algo.MD5.create();
readChunked(blob, (chunk, offs, total) => {
md5.update(CryptoJS.lib.WordArray.create(chunk));
if (cbProgress) {
cbProgress(offs / total);
}
}, (err) => {
if (err) {
reject(err);
} else {
// const hash = md5.finalize();
// const hashHex = hash.toString(CryptoJS.enc.Hex);
// resolve(hashHex);
const digest = md5.finalize();
resolve(digest.toString());
}
});
});
}
export { getMD5 };
算一个 200M 的文件居然 10 几秒.....我内网传完这个文件都比算 md5 快 慢在 CryptoJS.lib.WordArray.create ?
有没有其他更好的 md5 计算库
1
ctsed 2018-04-08 12:36:39 +08:00 via Android
硬盘读取也要时间啊
|
2
lolizeppelin OP 和都硬盘没关系呀, 我 js 用 websokcet 发完这个文件比算 md5 还块
|
3
tommyZZM 2018-04-15 13:45:38 +08:00
chunkSize 4MB 挺大的了
|