SHA256 指纹
Written: 2026.061. 为什么需要这讲
本项目的文档入库系统(第16讲)使用 SHA256 哈希实现增量入库——只更新变化的文件,跳过未变化的。这一机制是IndexManifest 的核心,但主讲义没有展开解释哈希算法本身。
2. 什么是哈希(Hash)
哈希函数是一种将任意长度的数据映射为固定长度摘要的算法。- 确定性:同一输入永远产生同一输出
- 雪崩效应:输入改一个比特,输出天差地别
- 单向性:无法从哈希值反推原始内容
- 碰撞抵抗:找到两个不同内容产生相同哈希值在计算上不可行
3. 为什么选择 SHA256
| 算法 | 输出长度 | 碰撞安全性 | 速度 |
|---|---|---|---|
| MD5 | 128 bit | ❌ 已破解 | 快 |
| SHA1 | 160 bit | ❌ 已破解 | 较快 |
| SHA256 | 256 bit | ✅ 安全 | 中等 |
| SHA512 | 512 bit | ✅ 非常安全 | 慢 |
4. 本项目的指纹计算
- 如果知识库有一个 500MB 的 PDF,
f.read()会把整个文件加载到内存 - 分块读取每次只在内存中保留 8KB,无论文件多大都不会 OOM
5. 增量检测机制
具体例子:6. 为什么不用文件修改时间
很多开发者第一时间想到用os.path.getmtime() 来判断文件是否变化。但这不可靠:
| 方法 | 问题 |
|---|---|
mtime | Git clone 后 mtime 是克隆时间,不是编辑时间;CI 环境 mtime 不稳定 |
| 文件大小 | 修改一个字不改变文件大小,但内容已不同 |
| SHA256 | ✅ 内容变化即指纹变化,跨平台可靠 |
7. 在版本号中的应用
SHA256 不仅用于文件指纹,还用于生成知识库版本号的配置哈希:8. 小结
- SHA256 = 任意输入 → 固定 256bit 输出,雪崩效应保证微小差异可检测
- 分块读取避免大文件撑爆内存
- 增量检测 = 文件指纹比较,跳过未变化文件
- 优于 mtime:Git clone、CI 环境下 mtime 不可靠

