全量sha-256不适合断点续传检测,因其需读取整个文件、无法分块独立计算且易导致内存溢出;正确做法是分块哈希+流式读取+indexeddb缓存+服务端块级比对闭环。

直接用 crypto.subtle.digest() 计算本地文件的 SHA-256 哈希值是可行的,但它本身无法实现“极速断点续传检测”——因为 SHA-256 是全量哈希,必须读取整个文件才能得出结果,和“断点续传”所需的分块校验逻辑本质冲突。
为什么全量 SHA-256 不适合断点续传检测
断点续传的核心是:快速判断“已上传的部分是否一致”,避免重复传输。这要求:
- 能对任意字节范围(如每 1MB)独立计算哈希,不依赖前后数据;
- 上传前预先生成所有分块哈希,并在服务端缓存;
- 客户端上传时,先发各块哈希给服务端比对,只上传不一致的块。
而 crypto.subtle.digest("SHA-256", data) 输入必须是完整 ArrayBuffer 或 Uint8Array,无法“流式增量更新”或“跳过前 N 字节”。读取大文件到内存再哈希,既慢又可能 OOM(比如 4GB 文件)。
正确做法:分块哈希 + 流式读取
用 File.slice() + FileReader 或 ReadableStream(现代推荐)分批读取,对每一块单独调用 crypto.subtle.digest():
async function hashChunk(file, start, end) {
const chunk = file.slice(start, end);
const arrayBuffer = await chunk.arrayBuffer();
return crypto.subtle.digest("SHA-256", arrayBuffer);
}
<p>// 示例:按 1MB 分块
const chunkSize = 1024 * 1024;
const chunks = [];
for (let i = 0; i </p><p>这样得到的是一个哈希数组(如 <code>[hash0, hash1, hash2, ...]</code>),可序列化后发送给服务端做块级比对。</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/ai/2223" title="Memories.ai"><img
src="https://img.php.cn/upload/ai_manual/000/000/000/175679962023075.png" alt="Memories.ai" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/ai/2223" title="Memories.ai" class="overflowclass">Memories.ai</a>
<p class="overflowclass">专注于视频解析的AI视觉记忆模型</p>
</div>
<a rel="nofollow" href="/ai/2223" title="Memories.ai" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><h3>真正提速的关键:避免重复读取 + 利用 IndexedDB 缓存</h3><p>用户反复上传同一文件时,每次都重算哈希很慢。可将文件元信息(<code>file.name + file.lastModified + file.size</code>)与对应块哈希存入 <code>IndexedDB</code>:</p>
- 上传前先查缓存:若元信息匹配且缓存未过期,直接复用旧哈希;
- 仅当文件被修改(
lastModified变)或首次上传时,才触发分块计算; - 缓存键建议加 salt 防碰撞,例如
`${name}|${size}|${mtime}`。
服务端需配合支持块哈希预检接口
前端不能单靠 JS 实现断点续传,服务端必须提供类似这样的 API:
POST /upload/check-chunks
{
"fileId": "abc123",
"chunkHashes": ["a1b2...", "c3d4...", ...]
}
→ 返回 { "uploadedChunks": [0, 2], "needUpload": [1, 3] }
否则前端算出哈希也无处验证,仍得从头上传。
所以,“极速断点续传检测”的本质不是换一个哈希函数,而是构建“客户端分块哈希 + 本地缓存 + 服务端块级比对”的闭环。SHA-256 可用,但必须用于每个块,而非整文件。










