Profile Hash 计算方法
February 25, 2026 · View on GitHub
概述
所有 Profile 类型的 Hash 基于 SHA256 算法,涉及文本的使用 UTF-8 编码。
Hash 值通常以大写十六进制字符串形式表示,实际使用时应该对大小写不敏感。
1. TextProfile (纯文本)
将文本进行UTF8编码后计算SHA256
2. FileProfile 和 ImageProfile (单个文件或图片)
- 计算文件内容的 SHA256 哈希值并转换为大写十六进制字符串
- 获取文件名(不含路径)
- 构造字符串:
文件名|文件内容SHA256字符串 - 对该字符串进行 UTF-8 编码后再次计算 SHA256
伪代码
ContentHash = SHA256(FileContent)
CombinedString = "FileName|" + ToUpperCase(ContentHash)
Hash = SHA256(UTF8(CombinedString))
3. GroupProfile (多文件或文件夹)
计算方法
对所有文件和目录排序后,按特定格式和顺序拼接成完整字符串计算 SHA256
详细说明
3.1 Entry 收集
- 收集所有输入文件/目录及其子文件/子目录,每一条作为一个 entry
- 每个 entry 以输入文件的父目录为根,取相对路径作为 EntryName
- EntryName 中的路径分隔符统一为
/ - 目录的 EntryName 以
/结尾
3.2 排序
- 取 EntryName 按 UTF-8 编码后的byte数组,以字典序升序排序
3.3 Entry 的 Hash 输入字符串格式
- 目录:
D|{entryName}\0 - 文件:
F|{entryName}|{length}|{contentHash}\0
其中:
{entryName}:相对路径名{length}:文件字节长度{contentHash}:文件内容的 SHA256 哈希值(大写十六进制)- 每条 entry 的 hash 输入字符串以
\0结尾
3.4 哈希计算
- 将所有 entry hash 输入字符串按序拼接成一个字符串,UTF8 编码后计算 SHA256
示例
假设有以下文件结构:
folder/
├── a.txt (100 bytes, hash: abc...123)
└── subdir/
└── b.txt (200 bytes, hash: def...456)
排序、拼接所有 Entry hash 输入字符串,得到最终的输入字符串(这里将\0显示为换行):
D|folder/
F|folder/a.txt|100|ABC...123
D|folder/subdir/
F|folder/subdir/b.txt|200|DEF...456
将上述字符串使用UTF8编码转换为 byte 数组,对此 byte 数组进行 SHA256 计算得到最终的hash