簡體   English   中英

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

[英]Calculate MD5 hash of a large file using javascript

如何使用 CryptoJS 上傳 500mb 文件並獲取 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,它就可以工作。 任何更大的,this.result 是一個空的“”。

我試過:

大文件上的文件閱讀器 API

javascript FileReader - 分塊解析長文件

幾乎讓它起作用了,但是控制台抱怨 .join("")

http://dojo4.com/blog/processing-huge-files-with-an-html5-file-input

CryptoJS 有一個用於哈希摘要漸進式 API 其余部分采用alediaferia 的答案,稍作修改。

 function process() { getMD5( document.getElementById("my-file-input").files[0], prog => console.log("Progress: " + prog) ).then( res => console.log(res), err => console.error(err) ); } function readChunked(file, chunkCallback, endCallback) { var fileSize = file.size; var chunkSize = 4 * 1024 * 1024; // 4MB var offset = 0; var reader = new FileReader(); reader.onload = function() { if (reader.error) { endCallback(reader.error || {}); return; } offset += reader.result.length; // callback for handling read chunk // TODO: handle errors chunkCallback(reader.result, offset, fileSize); if (offset >= fileSize) { endCallback(null); return; } readNext(); }; reader.onerror = function(err) { endCallback(err || {}); }; function readNext() { var fileSlice = file.slice(offset, offset + chunkSize); reader.readAsBinaryString(fileSlice); } readNext(); } function getMD5(blob, cbProgress) { return new Promise((resolve, reject) => { var md5 = CryptoJS.algo.MD5.create(); readChunked(blob, (chunk, offs, total) => { md5.update(CryptoJS.enc.Latin1.parse(chunk)); if (cbProgress) { cbProgress(offs / total); } }, err => { if (err) { reject(err); } else { // TODO: Handle errors var hash = md5.finalize(); var hashHex = hash.toString(CryptoJS.enc.Hex); resolve(hashHex); } }); }); }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/core.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.2/components/md5.js"></script> <input id="my-file-input" type="file"> <button onclick="process()">Process</button>

您不需要一次讀取整個文件並將其全部提供給 CryptoJS 例程。

您可以創建 hasher 對象,並在讀取時提供塊,然后獲得最終結果。

來自CryptoJS 文檔的示例

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM