使用JavaScript计算Blob的哈希值。

12

我想比较两个Blob以查看它们之间是否有变化。

一种方法是计算 Blob 的哈希值,然后进行比较,例如:

hash(firstBlob) === hash(secondBlob)

我该如何计算 Blob 的哈希值,并检查它是否与另一个哈希值不同?

2个回答

12

您可以使用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:看起来你是对的,已经修正了答案。谢谢! - Qantas 94 Heavy
1
在调用readAsBinaryString或readAsArrayBuffer之前,您应该先定义onloadend方法:否则,如果缓冲区足够小,则可能会在事件触发后注册onloadend事件处理程序。 - Thierry
@Thierry:在我的经验中,我认为这种情况从未发生过——如果我没记错的话,readAs*被定义为异步的,这意味着onloadend函数将在事件被调用之前被定义。 - Qantas 94 Heavy
异步并不意味着这样。异步意味着它可能在下一条指令之后运行,也可能在之前运行。在这种情况下,我们观察到大多数情况下它会在下一条指令之后运行。但是这并不是保证。 - Thierry
1
由于行为是特定于浏览器的,并且可能是异步的,最好假设它是异步的。因此,在调用将导致事件被发射的函数之前,最好先设置事件处理程序。 - Matt Welke
显示剩余2条评论

8

我知道这可能有些过时了,但对于那些寻找更好和更新解决方案的人,请使用加密API和SHA-256或更高变体的算法,因为MD5存在可利用的漏洞。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接