Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript计算大文件的MD5哈希_Javascript_Md5_Filereader_Cryptojs - Fatal编程技术网

使用javascript计算大文件的MD5哈希

使用javascript计算大文件的MD5哈希,javascript,md5,filereader,cryptojs,Javascript,Md5,Filereader,Cryptojs,如何上传一个500mb的文件并使用CryptoJS获取MD5哈希 这是我的密码: $('#upload-file').change(function(){ var reader = new FileReader(); reader.addEventListener('load',function () { var hash = CryptoJS.MD5(CryptoJS.enc.Latin1.parse(this.result)); window.

如何上传一个500mb的文件并使用CryptoJS获取MD5哈希

这是我的密码:

$('#upload-file').change(function(){
    var reader = new FileReader();
    reader.addEventListener('load',function () {
        var hash = CryptoJS.MD5(CryptoJS.enc.Latin1.parse(this.result));
        window.md5 = hash.toString(CryptoJS.enc.Hex);
    });

    reader.readAsBinaryString(this.files[0]);
});
如果文件小于200mb,则可以正常工作。任何更大的值,这个结果都是空的“”

我试过:

这几乎可以实现了,但console正在抱怨。join(“”)


您不需要一次读取整个文件,然后一次将其全部输入CryptoJS例程

您可以创建hasher对象,并在读取块时对其进行馈送,然后获得最终结果

样本取自

CryptoJS有一个。其余的是经过轻微修改后形成的

函数过程(){
getMD5(
document.getElementById(“我的文件输入”).files[0],
prog=>console.log(“进度:+prog”)
).那么(
res=>console.log(res),
err=>console.error(err)
);
}
函数readChunked(文件、chunkCallback、endCallback){
var fileSize=file.size;
var chunkSize=4*1024*1024;//4MB
var偏移=0;
var reader=new FileReader();
reader.onload=函数(){
if(读卡器错误){
endCallback(reader.error | |{});
返回;
}
偏移量+=reader.result.length;
//处理读块的回调
//TODO:处理错误
chunkCallback(reader.result、offset、fileSize);
如果(偏移量>=文件大小){
endCallback(null);
返回;
}
readNext();
};
reader.onerror=函数(err){
endCallback(err |{});
};
函数readNext(){
var fileSlice=file.slice(偏移量,偏移量+块大小);
reader.readAsBinaryString(fileSlice);
}
readNext();
}
函数getMD5(blob、cbProgress){
返回新承诺((解决、拒绝)=>{
var md5=CryptoJS.algo.md5.create();
readChunked(blob,(区块、关闭、总计)=>{
md5.update(CryptoJS.enc.Latin1.parse(chunk));
如果(CBP进度){
CBP进度(关闭/总计);
}
},err=>{
如果(错误){
拒绝(错误);
}否则{
//TODO:处理错误
var hash=md5.finalize();
var hashHex=hash.toString(CryptoJS.enc.Hex);
解决(hashHex);
}
});
});
}


处理
作为备用,除非外部服务需要,否则不要使用MD5。MD5坏了。使用SHA-256或更高版本。我需要使用MD5进行此项目。谢谢Tamas。我尝试了一个简单的.txt文件,它的作品。但是,当我尝试同一个文件的.zip时,哈希值不正确。有一些二进制垃圾,我认为chrome试图在utf8找到它时对其进行解码,cryptojs默认使用utf8编码将字符串转换为字数组。必须先转换。@Arthur这是
md5.update(CryptoJS.enc.Latin1.parse(chunk))
部分,我把它添加到了snippet@HDog通过一些修改和一些编码,您可以使用MSIE支持的。另外,告诉你的客户MSIE已经死了,如果他们坚持支持MSIE,至少要收取双倍的费用。
var sha256 = CryptoJS.algo.SHA256.create();
sha256.update("Message Part 1");
sha256.update("Message Part 2");
sha256.update("Message Part 3");
var hash = sha256.finalize();