【问题标题】:Calculate the hash of Blob using JavaScript使用 JavaScript 计算 Blob 的哈希值
【发布时间】:2013-12-17 00:02:13
【问题描述】:

我想比较两个Blobs,看看它们之间是否有变化。

一种方法是计算 blob 的哈希值,然后比较它们,例如:

hash(firstBlob) === hash(secondBlob)

如何计算 Blob 的哈希值并检查另一个哈希值是否已更改?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您可以使用FileReader API 来获取 blob 的内容以进行比较。如果你必须为此使用 CryptoJS,你可以使用readAsBinaryString:

    var a = new FileReader();
    a.readAsBinaryString(blob);
    a.onloadend = function () {
      console.log(CryptoJS.MD5(CryptoJS.enc.Latin1.parse(a.result)));
    };
    

    请注意,readAsBinaryString 已弃用,因此如果您可以使用其他库,例如 SparkMD5,则可以使用数组缓冲区:

    var a = new FileReader();
    a.readAsArrayBuffer(blob);
    a.onloadend = function () {
      console.log(SparkMD5.ArrayBuffer.hash(a.result));
    };
    

    【讨论】:

    • @RaymondWu:看来你是对的,修正了答案。谢谢!
    • 您应该在调用 readAsBinaryString 或 readAsArrayBuffer 之前定义 onloadend 方法:否则,如果缓冲区足够小,您可能会在事件触发后注册 onloadend 事件处理程序
    • @Thierry:我认为这在我的经验中从未发生过——IIRC readAs* 被定义为异步的,这意味着 onloadend 函数将在事件被调用之前被定义。
    • 异步并不是这个意思。异步意味着它可能在下一条指令之后运行。它也可能以前运行过。在这种特殊情况下,我们观察到大部分时间它在下一条指令之后运行。但不能保证。
    • 由于行为是特定于浏览器的,并且可能是异步的,因此最好假设它是异步的。因此,最好在调用将导致事件发出的函数之前设置事件处理程序。
    【解决方案2】:

    我知道这有点旧,但对于寻找更好和更新解决方案的人,请使用Crypto API 和算法的 SHA-256 或更高版本,因为 MD5 有 exploitable 缺陷。

    var a = new FileReader();
    a.readAsArrayBuffer(blob);
    a.onloadend = function () {
      let hashPromise = crypto.subtle.digest("SHA-256", a.result);// it outputs a promise
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-02
      • 2016-10-17
      • 2014-04-01
      • 2016-06-23
      • 2016-12-30
      • 2013-06-07
      • 1970-01-01
      • 2010-10-20
      相关资源
      最近更新 更多