分段计算的
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 计算库
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.