一、你每天都在用但不一定知道的东西
如果你用过磁力链接,一定见过那串以 magnet:?xt=urn:btih: 开头后面跟着 40 个字符的链接。那 40 个字符就是 Info Hash——整个磁力链接最核心的部分。你可能每天都在用它,但从来没想过这串字符到底是怎么来的,又为什么能代表一个文件。
今天我就来把这个东西彻底讲明白。
二、Info Hash 的生成过程
要理解 Info Hash,得先知道 BT 种子文件的结构。一个 .torrent 文件本质上是一个 Bencode 编码的字典,包含两个顶层字段:
- announce:Tracker 服务器的地址
- info:一个字典,包含文件名、文件长度、分块大小、每个分块的 SHA-1 哈希值等信息
Info Hash 的生成过程非常直接:把 info 这个字典完整地提取出来,用 Bencode 编码后的原始字节流,计算其 SHA-1 哈希值。得到的 20 字节(160 位)结果,用十六进制表示就是 40 个字符——这就是 Info Hash。
用伪代码表示就是:
info_hash = SHA1(bencode(torrent_file["info"]))
关键点在于:announce 地址、创建时间这些字段不在 info 字典里,所以它们的变化不会影响 Info Hash。只有文件内容和分块方式变了,Info Hash 才会变。
三、为什么能去重?
Info Hash 能去重,基于两个数学特性:
确定性——同样的输入一定产生同样的输出
如果两个种子文件的 info 字典完全一样(即包含相同的文件、相同的分块方式),那么它们的 Info Hash 就一定相同。哪怕这两个种子是由不同的人在不同时间创建的,哪怕 tracker 地址完全不同,只要 info 部分一样,Info Hash 就一样。
唯一性——不同内容几乎不可能产生相同哈希
SHA-1 产生 160 位的哈希值,理论上可以表示 2^160 种不同的结果——这个数字大到难以想象,大约是 1.4 乘以 10 的 48 次方。而全世界所有文件加起来的数量远远小于这个值。所以两个不同文件产生相同 Info Hash(即哈希碰撞)的概率在实际中可以忽略不计。
正是这两个特性让 Info Hash 成了文件在 P2P 网络中的"身份证号"——同一个人每次生成的号码一样,不同的人号码一定不同。
四、Info Hash 在实际中怎么起作用
在 DHT 网络中
当你用磁力链接搜索资源时,客户端拿着 Info Hash 去 DHT 网络中查询。DHT 网络中的节点根据 Info Hash 来"认领"——如果你的 Info Hash 和我正在做种的某个资源匹配上了,我就告诉你我的 IP 和端口,你就可以直接连我下载。
整个过程中,Info Hash 就是查询的 key,就像你拿着一个身份证号去数据库里查人一样。
在去重方面
假设你在网上看到了五个不同来源的下载链接,表面上看它们可能名字不同、描述不同、甚至文件大小的显示方式不同,但只要它们的 Info Hash 相同,就一定是完全相同的文件。反过来,Info Hash 不同的话,哪怕文件名一样,内容也一定不同。
这也是为什么用磁力古哥搜索时,同一个资源可能显示多条结果,但 Info Hash 相同的话,实际指向的就是同一份数据。
五、Info Hash 的两种格式
| 格式 | 长度 | 编码方式 | 示例 |
|---|---|---|---|
| Hex(十六进制) | 40 字符 | 纯十六进制 | e8d2c4b5a1f7... |
| Base32 | 32 字符 | Base32 编码 | YQGNWJH7E4... |
BT v1 协议使用的是 SHA-1 哈希,输出 160 位,十六进制表示为 40 字符。BT v2 协议使用的是 SHA-256,输出 256 位,但由于采用了分层哈希树的结构,实际使用的根哈希也是截取到一定长度的。
你在磁力链接里常见的 40 字符格式就是 Hex 编码的 SHA-1 Info Hash。有些站点会使用 Base32 格式(32 字符),两者表示的是同一个东西,只是编码方式不同。
六、Info Hash 和文件哈希值的区别
很多人会把 Info Hash 和文件本身的哈希值搞混,这里需要区分清楚:
| 对比项 | Info Hash | 文件哈希值 |
|---|---|---|
| 计算对象 | 种子的 info 字典 | 文件内容本身 |
| 包含信息 | 文件名 + 分块大小 + 分块哈希 | 仅文件原始内容 |
| 相同文件不同打包 | Info Hash 不同 | 文件哈希相同 |
| 用途 | BT 网络中定位资源 | 校验单个文件完整性 |
举例说明:同一个电影文件,如果一个人把它单独打包成种子,另一个人把它和字幕文件一起打包成种子,那么这两个种子的 Info Hash 是不同的(因为 info 字典包含的文件列表不同)。但电影文件本身的哈希值是一样的。
七、Info Hash 的安全性
有人可能会问:Info Hash 会不会被伪造?
从数学上说,找到两个不同内容产生相同 SHA-1 值的"碰撞攻击"在理论上是可能的(Google 在 2017 年就展示了 SHA-1 碰撞)。但在 BT 场景中这基本不是问题,因为 info 字典里还包含了每个分块(通常 256KB - 4MB)的 SHA-1 哈希列表。要伪造一个通过所有分块校验的假文件,计算成本极高,没有实际意义。
更重要的是,BT 下载后客户端会自动校验所有分块的哈希值,任何数据损坏或篡改都会被立即检测出来。
八、总结
Info Hash 就是种子文件中 info 字典的 SHA-1 指纹。它天然具备确定性和唯一性,因此能在全球 P2P 网络中精确定位一个资源,同时自动完成去重。理解了 Info Hash,你就理解了磁力链接为什么能用 40 个字符代替一个完整的种子文件。