小文件計(jì)算sha256:
import sha256 from 'crypto-js/256'
console.log(sha256('message'));
大文件流式計(jì)算sha256
超大文件的sha256,不能直接用上面方法sha256(file),這會(huì)讓用戶等待非常久,所以需要流式計(jì)算,原理大概就是把file切割成一小塊,比如10M為一個(gè)單位來分批次計(jì)算,最后在整合成一個(gè)完整的sha256,示例代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-680678.html
<!DOCTYPE html>
<html>
<head>
<title>文件流式處理和SHA256哈希值生成</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
</head>
<style>
.aaa {
height: 20px;
width: 1000px;
border: 1px solid blue;
padding: 5px;
}
.bbb {
height: 100%;
background: green;
width: 0;
}
</style>
<body>
<h1>選擇文件并計(jì)算SHA256哈希值</h1>
<input type="file" id="fileInput" />
<br>
<br>
<div class="aaa">
<div class="bbb" id="aaa"></div>
</div>
<div>結(jié)果是:<span id="result"></span></div>
<script>
// 創(chuàng)建一個(gè) SHA-256 的哈希對(duì)象
const hash = CryptoJS.algo.SHA256.create();
const bufferChunkSize = 1024 * 1024; // 64 KB
let count = 0;
var aaa = document.getElementById('aaa');
function calculateSHA256(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
// 以流的方式讀取文件
function readChunk(start, end) {
const slice = file.slice(start, end);
reader.readAsArrayBuffer(slice);
}
// 遞歸讀取文件的每個(gè)分塊
function processChunk(offset) {
const start = offset;
const end = Math.min(start + bufferChunkSize, file.size);
count = end;
readChunk(start, end);
}
// 當(dāng)讀取完整個(gè)文件后,計(jì)算哈希值并返回
reader.onloadend = function () {
const arrayBuffer = reader.result;
const wordArray = CryptoJS.lib.WordArray.create(arrayBuffer);
// 更新哈希對(duì)象
hash.update(wordArray);
console.log('start', count, file.size);
if (count < file.size) {
// 繼續(xù)處理下一個(gè)分塊
processChunk(count);
aaa.style.width = count / file.size * 100 + '%'
}
else {
// 計(jì)算哈希值并返回
const sha256Hash = hash.finalize();
resolve(sha256Hash.toString());
}
};
// 開始處理文件內(nèi)容分塊
processChunk(0);
});
}
// 選擇文件并計(jì)算SHA256哈希值
const fileInput = document.getElementById('fileInput');
fileInput.addEventListener('change', async function (e) {
const file = e.target.files[0];
try {
const sha256Hash = await calculateSHA256(file);
document.getElementById('result').innerText = sha256Hash;
console.log('SHA256哈希值:', sha256Hash);
} catch (error) {
console.error('計(jì)算SHA256哈希值時(shí)出錯(cuò):', error);
}
});
</script>
</body>
</html>
文章來源:http://www.zghlxwxcb.cn/news/detail-680678.html
到了這里,關(guān)于js流式計(jì)算大文件sha256的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!