js 算文件 md5 咋那么慢?还是我写法有问题

2018-04-08 11:35:06 +08:00
 lolizeppelin

分段计算的

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 计算库

3857 次点击
所在节点    问与答
3 条回复
ctsed
2018-04-08 12:36:39 +08:00
硬盘读取也要时间啊
lolizeppelin
2018-04-08 17:36:13 +08:00
和都硬盘没关系呀, 我 js 用 websokcet 发完这个文件比算 md5 还块
tommyZZM
2018-04-15 13:45:38 +08:00
chunkSize 4MB 挺大的了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/445009

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX