通过Crypto.js获取文件的md5sum

我试图得到一个tar文件的md5sum产生相同的值,当使用md5sum linux命令和CryptoJS的MD5方法。

在JavaScript中,我(在将文件放入HTML表单后):

var reader = new FileReader(); reader.onloadend = function () { text = (reader.result); } reader.readAsBinaryString(document.getElementById("firmware_firmware").files[0]); var hash = CryptoJS.MD5(text); hash.toString(); 

在Linux中我做到:

 md5sum name_of_file.tar 

目前这两个产生不同的结果。 我怎样才能使JavaScript获得的tar文件的内容是MD5ed的md5sum在Linux上做的相同的方式?

对于一个简单的string,md5sum和CryptoJS产生相同的值。

编辑:使用名为Fred.txt的文件,内容为“Fred”,md5sum和CryptoJS都会生成相同的值:c624decb46fa3d60e824389311b252f6。

在update.tar文件上,linux上的md5sum给我:1f046eedb7d8279953d233e590830e4f,在CryptoJS上它给我:f0c3730e5a9863cffa0ba3fadd531788

编辑2:进一步testing表明,这实际上是一个问题,由于大文件的大小,如7兆字节

JavaScript中的所有字符串 – 甚至是“二进制字符串” – 实际上都是UTF-16字符。 “二进制字符串”是一个选择只使用前256个代码点。 由于Latin-1编码也使用前256个编码点,所以可以使用Latin-1将字符串转换为字节。

 var hash = CryptoJS.MD5(CryptoJS.enc.Latin1.parse(text)); 

我认为这是因为文件没有完成加载,并在文件上传100%之前创建哈希。 尝试将哈希移动到onloadend事件中:

 var reader = new FileReader(); reader.onloadend = function () { var hash = CryptoJS.MD5(reader.result); hash.toString(); } reader.readAsBinaryString(document.getElementById("firmware_firmware").files[0]);