磁力链接里的那串字符是什么?btih 哈希值科普
先看一条完整的磁力链接
随手打开一条磁力链接,长这样:
magnet:?xt=urn:btih:5f2a9c8e1b3d4a6f7e8d9c0b1a2f3e4d5c6b7a8f&dn=example&tr=http://tracker.example.com:6969/announce
看着乱,其实就三段:协议头 magnet:、查询参数 xt,以及后面挂着的几个可选参数。真正决定这条链接能用不能用的,只有一个东西。
btih 后面那串,是文件内容的指纹
btih 是 BitTorrent InfoHash 的缩写。做法是把种子文件里描述文件结构的那部分内容(文件列表、每个分片的大小)拿出来,做一次 SHA-1,得到 40 位十六进制字符。
关键词是“算出来的”,不是“分配出来的”。谁都能对同一份文件算出同一个哈希,没有人需要去注册或者申请。只要你手里文件的字节和当初做种的人完全一致,哈希就一致。
所以这串字符没法伪造也没法猜,一位对不上就是完全不同的文件。改一个字符,指向的东西就彻底变了。
为什么一个哈希就能找到资源
常规下载的思路是“知道地址,去这台服务器拿”。磁力链接反过来:它不告诉你文件在哪,只告诉你文件长什么样,然后靠 P2P 网络里其他客户端帮你反查。
具体来说,客户端拿到哈希之后会去两个地方问:一是 Tracker,按哈希登记有哪些人在下/做种;二是 DHT 网络,这是一个去中心化的分布式哈希表,每个客户端都是一小块索引。两边只要有一个人返回节点列表,你就能连上去开始下。
这也是磁力链接比种子文件抗失效的根本原因:没有一个中心节点存着文件列表,也就没有“这个站倒闭了链接就废了”的问题。
dn、tr、xl 这些参数其实可有可无
除了 btih,其他参数都是发布者顺手加的:
- dn:显示名称,只影响下载工具里显示的文件名,跟能不能下没关系,所以它可以随便填,甚至填错的。
- tr:Tracker 地址,可以挂好几个,客户端会挨个试。
- xl:文件总长度,用来提前知道大小。
把 dn 和 tr 全删掉,只留 btih,链接照样能用。反过来也成立:dn 写着一个片名,实际内容是什么,只有 btih 说了算。
40 位和 32 位,是同一个哈希
逛久了会发现有的链接哈希是 40 个字符(0-9 和 a-f),有的是 32 个字符(含大写字母和数字)。这是同一个值的两种编码:前者是十六进制,后者是 Base32,两者可以互相转换。
知道这点有实际用处:搜到一个 32 位的链接,和 40 位的那条很可能指向同一个资源,不用当成两个东西重复下载。
几个常见的误解
- “后面几位改了应该还能下”——不行,哈希是最严格的校验,任何一位不同都是另一个资源。
- “链接里有片名,就是原版资源”——不一定,dn 由发布者填写,内容以 btih 为准。
- “哈希一样但文件大小不一样”——不存在这种可能,大小也参与哈希计算。
写在最后
记住一句话就够了:btih 是内容的指纹,其余参数都是给人看的。以后判断两条链接是不是同一个资源,直接比 btih,比看标题可靠得多。
magnet:?xt=urn:btih:5f2a9c8e1b3d4a6f7e8d9c0b1a2f3e4d5c6b7a8f&dn=magnet-engine-demo
该字段为演示用的占位示例代码,本站不制作、不存储、不提供任何资源文件。