spark-MD5 算MD5

87 阅读3分钟

下面我用“非常直白、能看懂源码就懂原理”的方式,给你解释:

✦ 1. spark-md5 是什么?

⚡ spark-md5 = 一个 浏览器端计算 MD5 的库

作用:

  • 能够对 大文件增量 MD5 计算

  • 不需要一次性把整个文件读入内存

  • 提供两个重要方法:

    • append(arrayBuffer):给 MD5 计算器追加一段数据
    • end():结束并返回 MD5 字符串

就像这样:

const spark = new SparkMD5.ArrayBuffer()
spark.append(chunk1)
spark.append(chunk2)
spark.append(chunk3)
const result = spark.end()

它就等于:

我分多次把数据丢进去,最后给我一个 MD5 值。


✦ 2. FileReader 是什么?

📘 FileReader = 浏览器内置的文件读取 API。

它不能算 MD5,也不能分片,它只负责读文件。

作用:

  • 读取 FileBlob 的内容

  • 能以多种格式读:

    • readAsArrayBuffer() → 返回二进制数据
    • readAsText() → 返回文本
    • readAsDataURL() → 返回 Base64

你的代码用的是:

fileReader.readAsArrayBuffer(blob)

读完后触发:

fileReader.onload = function(e) {
    // e.target.result 就是读出的 ArrayBuffer
}

总结:

FileReader 负责读文件;spark-md5 负责算 MD5。

它们配合使用。


✦ 3. file.slice() 是什么?

✂️ slice()FileBlob 的方法 ⇒ 用来把一个大文件切片

例如:

const chunk = file.slice(0, 1024 * 1024) // 从 0 到 1MB

结果是一个 Blob,也就是大文件中的某一段。

常用来:

  • 大文件上传
  • 断点续传
  • 文件 hash 校验(你的例子)

注意:

浏览器早期名字不统一,你的代码兼容旧写法:

File.prototype.slice ||
File.prototype.mozSlice ||
File.prototype.webkitSlice;

现代浏览器直接用:

file.slice(start, end)

✦ 4. “MD5” 是什么?

🔑 MD5 = 一种哈希算法。

作用:

  • 把任意内容变成一个 32 字符的十六进制字符串
  • 同样的文件一定生成同样的 MD5
  • 不同文件几乎不可能生成同样的 MD5(理论上有冲突,但一般够用)

例如:

"hello"5d41402abc4b2a76b9719d911017c592

在文件处理中常用于:

  • 校验文件完整性
  • 判断文件是否已存在
  • 分片上传对比一致性

✦ 组合在一起是什么效果?

完整流程如下⬇️

      file(大文件)
           ↓
     file.slice() 分片
           ↓
  FileReader.readAsArrayBuffer()
           ↓
     spark-md5.append()
           ↓ (循环所有分片)
     spark-md5.end()  → MD5 值

所以:

组件干什么用
file.slice()把文件切块
FileReader把文件块读出来
spark-md5把每个块加入 MD5 计算器
md5()(你的函数)把上面整个流程封装成一个 Promise

✦ 更形象的比喻

假设你有一本巨大的书,你想算它的“指纹”(MD5)。

  • file.slice() = 把书按页分开
  • FileReader = 找个人去读书页
  • spark-md5.append() = 把每页内容记录进计算器
  • spark-md5.end() = 最后输出整本书的指纹

✦ 简短总结(记住这一段就够了)

  • file.slice()切分大文件用的
  • FileReader读取切分后的内容
  • spark-md5把读取到的内容算成 MD5
  • md5()用上面三个基础能力封装的逻辑

如果你愿意,我还可以给你:

✔ 一张图表示完整流程
✔ 更简单的 20 行 MD5 计算示例
✔ 或帮你用 Promise / async await 重写更好看的代码

你想看哪个?