可是上面的方式會把文件一次性讀入內存,很是耗瀏覽器內存,當文件比較大時,容易致使瀏覽器崩潰,所以採用了CryptoJS update的方式,增量計算哈希值
function loadFile(fileId,hashId){
var contractFile = $("#"+fileId)[0].files[0];
var reader = new FileReader();
var blobSlice = File.prototype.mozSlice || File.prototype.webkitSlice || File.prototype.slice;
// 指定文件分塊大小(2M)
var chunkSize = 6 * 1024 * 1024;
// 計算文件分塊總數
var chunks = Math.ceil(contractFile.size / chunkSize);
// 指定當前塊指針
var currentChunk = 0;
var hasher = CryptoJS.algo.SHA256.create();
// FileReader分片式讀取文件
// 計算開始讀取的位置
var start = currentChunk * chunkSize;
// 計算結束讀取的位置
var end = start + chunkSize >= contractFile.size ? contractFile.size : start + chunkSize;
reader.readAsArrayBuffer(blobSlice.call(contractFile, start, end));
reader.onload = function(evt){
var fileStr = evt.target.result;
var tmpWordArray = arrayBufferToWordArray(fileStr);
hasher.update(tmpWordArray);
currentChunk += 1;
fileStr = null;
tmpWordArray = null;
// 判斷文件是否都已經讀取完
if (currentChunk < chunks) {
// 計算開始讀取的位置
var start = currentChunk * chunkSize;
// 計算結束讀取的位置
var end = start + chunkSize >= contractFile.size ? contractFile.size : start + chunkSize;
reader.readAsArrayBuffer(blobSlice.call(contractFile, start, end));
}
}
reader.onloadend = function(){
contractFile = null;
var fileobj = document.getElementById(fileId);
if(fileobj.outerHTML){
fileobj.outerHTML = fileobj.outerHTML;
}
CollectGarbage();
var hash = hasher.finalize();
$("#"+hashId).val(hash);
hasher = null;
blobSlice = null;
reader = null;
hash = null;
CollectGarbage();
}
}
parse和stringify
var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
var wordArray = CryptoJS.enc.Hex.parse(hexString);
var wordArray = CryptoJS.enc.Base64.parse(base64String);
var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
var hexString = CryptoJS.enc.Hex.stringify(wordArray);
var base64String = CryptoJS.enc.Base64.stringify(wordArray);
消息摘要算法
var hash = CryptoJS.MD5(message);
var hash = CryptoJS.MD5(wordArray);
......
update調用方式
var hasher = CryptoJS.algo.SHA256.create();
hasher.reset();
hasher.update('message');
hasher.update(wordArray);
var hash = hasher.finalize();
var hash = hasher.finalize('message');
var hash = hasher.finalize(wordArray);