
分段计算的
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 年 4 月 8 日 via Android 硬盘读取也要时间啊 |
2 lolizeppelin OP 和都硬盘没关系呀, 我 js 用 websokcet 发完这个文件比算 md5 还块 |
3 tommyZZM 2018 年 4 月 15 日 chunkSize 4MB 挺大的了 |