【问题标题】:How to calculate md5 checksum of blob using CryptoJS如何使用 CryptoJS 计算 blob 的 md5 校验和
【发布时间】:2016-04-02 06:00:57
【问题描述】:

使用 Blob API 分块上传文件。 在这里,我想检查 blob 的 md5 校验和。 当我尝试下面的代码时,它对文本文件工作正常,但它为二进制文件返回不同的值。

var reader = new FileReader();
reader.readAsBinaryString(blob);
reader.onloadend = function () {
    var mdsum = CryptoJS.MD5(reader.result);
    console.log("MD5 Checksum",mdsum.toString());
};

如何正确计算所有类型文件的 blob 的 md5 校验和?

【问题讨论】:

标签: javascript md5 md5sum


【解决方案1】:

使用以下代码创建正确的 md5 哈希:

  function calculateMd5(blob, callback) {
    var reader = new FileReader();
    reader.readAsArrayBuffer(blob);
    reader.onloadend = function () {
      var wordArray = CryptoJS.lib.WordArray.create(reader.result),
          hash = CryptoJS.MD5(wordArray).toString();
      // or CryptoJS.SHA256(wordArray).toString(); for SHA-2
      console.log("MD5 Checksum", hash);
      callback(hash);
    };
  }

更新(简单一点):

 function calculateMd5(blob, callback) {
    var reader = new FileReader();
    reader.readAsBinaryString(blob);
    reader.onloadend = function () {
      var  hash = CryptoJS.MD5(reader.result).toString();
      // or CryptoJS.SHA256(reader.result).toString(); for SHA-2
      console.log("MD5 Checksum", hash);
      callback(hash);
    };
  }

确保包含来自 CryptoJS 库的 core.jslib-typedarrays.js重要)和 md5.js 组件。
请参阅此fiddle 以获取完整示例(由于原始访问控制,它在 fiddle 上不起作用,请在本地服务器上尝试)。

【讨论】:

  • 您应该在调用readAsBinaryStringreadAsArrayBuffer 之前定义onloadend 方法:否则,如果缓冲区足够小,您可能会在事件发生后注册onloadend 事件处理程序触发。
  • @Thierry 你能演示一下吗? readAsBinaryString 方法在队列中启动一个新任务,当 reader.onloadend 设置时(作为 JavaScript 事件循环的效果),该任务不在同一个堆栈中执行。所以reader.readAsBinaryStringreader.onloadend 的顺序无关紧要。
  • 嗯,今天下午我在使用这段代码的时候就遇到了。触发对onloadend 的调用的方法是readAsBinaryString(来自mozilla:When the read operation is finished, the readyState becomes DONE, and the loadend is triggered),在您的代码中,您在 将触发它的方法之后注册事件处理程序。也许它会在 99% 的时间里工作,但它也会在某个时候失败。在每种情况下都可以反转这两个操作。
  • @Thierry 你能简单地给我看一个演示来演示这个问题吗?这些行的执行顺序无关紧要,因为读取操作会在队列中启动一个新任务。 specification 说:Initiate an annotated task read operation using the blob argument as input and handle tasks queued on the file reading task source per below.
  • 这是一个竞争条件。如果不使用Thread.sleep,通常很难在具有良好多线程的平台上演示它。但这是 javascript,多线程行为将取决于使用的浏览器,并且没有 Thread.sleep。但是也可以使用调试器发现竞争条件,并单步执行代码。这是一个 jsfiddle:jsfiddle.net/k73va9ob/2。打开它,打开开发控制台 (F12),运行它,单击按钮,一旦断点被​​击中,单击“播放”按钮。你会看到onloadend 方法没有被调用。
猜你喜欢
  • 2010-12-12
  • 2011-05-25
  • 2012-05-18
  • 2017-04-07
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2012-02-28
相关资源
最近更新 更多