BT9G LABS / DHT 深度解析 #04
InfoHash 深度解析:BitTorrent v1、v2、Magnet、BTIH 與 BTMH
理解 BitTorrent 內容標識如何計算,以及 v1 SHA-1、v2 SHA-256、BTIH 與 BTMH 在 Magnet 鏈接中的關係。
BT9G Labs / DHT Deep Dive #04. 從內容身份邊界出發,解釋 v1 與 v2 Torrent 如何生成雜湊,以及搜索索引應如何正確處理兩代標識。
快速摘要
- 主題: InfoHash 深度解析:BitTorrent v1、v2、Magnet、BTIH 與 BTMH
- 核心關鍵詞: InfoHash, BitTorrent v1, BitTorrent v2, BTIH, BTMH
- 適合讀者: 後端工程師、協議研究者、搜索工程師以及 BitTorrent 實現者
- 目標: 用足夠準確的協議與系統視角解釋原理,並能直接支持真實的採集、索引和搜索架構設計。
系統視圖
info dictionary 才是身份邊界
在 BitTorrent 中,Torrent 的內容身份並不是對整個 .torrent 檔案隨便做一次雜湊。v1 的 InfoHash 是對 bencoded info dictionary 的編碼結果執行 SHA-1;因此注釋、創建者、Tracker 列表等 info 之外的欄位發生變化時,v1 InfoHash 可以保持不變。
索引器如果重新序列化 info 結構再計算雜湊,必須極其謹慎。尤其是解析後重編碼可能改變原始字節序列,進而得到不同的雜湊。最安全的做法是保留用於身份校驗的原始字節邊界。
v1 與 BTIH
經典 BitTorrent v1 使用 20 字節 SHA-1 InfoHash。在 Magnet URI 中,這種標識通常通過 xt=urn:btih:... 表示,可以是十六進制或 Base32 編碼。大量 DHT、Tracker 與現有索引生態都圍繞這個 160-bit 標識構建。
資料庫層應把“原始二進制雜湊”和“展示編碼”分開。十六進制大小寫差異不應該製造兩個資源記錄,使用者輸入的 Base32 也應規範化到同一個 canonical key。
v2、SHA-256 與 BTMH
BitTorrent v2 在 BEP 52 中引入 SHA-256 和 Merkle tree 等設計,內容身份不再完全等同於傳統 v1 的 20 字節雜湊。Magnet 表示通常使用 multihash 形式的 urn:btmh:。此外還存在同時兼容 v1 與 v2 的 hybrid torrent。
因此現代搜索系統不能把“InfoHash 永遠就是 40 個十六進制字符”寫死在所有資料模型中。更穩妥的設計是顯式保存協議版本、雜湊算法、原始摘要以及可用於 URL/搜索的規範化表示。
對索引系統意味著甚麼
內容身份是去重、Metadata 校驗、詳情頁路由和跨來源合併的基礎。v1、v2 和 hybrid 資料必須採用明確規則,不能簡單把不同 namespace 的字串塞進同一列後靠長度猜類型。
對於 BT9G 一類系統,最好讓 canonical content identity 與“從哪裡發現”“哪些 Tracker 出現過”“最近有哪些 Peer 活躍”解耦。這樣同一內容可以聚合多種網路來源,同時不污染真正的身份欄位。
實現示意
import hashlib
def v1_infohash(raw_bencoded_info: bytes) -> bytes:
return hashlib.sha1(raw_bencoded_info).digest()
def v2_infohash(raw_bencoded_info: bytes) -> bytes:
return hashlib.sha256(raw_bencoded_info).digest()
BT9G Labs 工程筆記
對 BT9G 一類索引系統而言,最重要的不是單純追求事件數量,而是把內容身份、網路觀察、採集狀態和搜索文檔拆成清晰的資料層。所有來自 DHT 或 Peer 的欄位都應該保留來源與時間戳,並通過階段化指標區分發現、連接、協商、Metadata 獲取、校驗、入庫和索引等環節。這樣才能在規模擴大後定位真實瓶頸,而不是把所有失敗都歸因於“網路不穩定”。
常見誤區
- 對整個
.torrent檔案直接計算 v1 InfoHash。 - 把十六進制大小寫差異當成不同資源。
- 假設所有 InfoHash 都固定為 20 字節 SHA-1。
- 沒有為 v2 和 hybrid torrent 預留資料模型。
相關 BT9G Labs 文章
- Kademlia 原理詳解:XOR 距離、路由與 BitTorrent DHT 的可擴展性
- BitTorrent DHT 如何找到 Peer:從 Bootstrap 到 get_peers 與 announce_peer
- BEP 5 DHT 報文詳解:ping、find_node、get_peers 與 announce_peer
- DHT Routing Table 內部原理:k-Bucket、節點 Churn 與聯繫人選擇
參考資料
- BEP 3 - The BitTorrent Protocol Specification
- BEP 52 - The BitTorrent Protocol Specification v2
- BEP 9 - Extension for Peers to Send Metadata Files
下一篇: BEP 5 DHT 報文詳解:ping、find_node、get_peers 與 announce_peer →
本文用於解釋公開的 BitTorrent 協議與工程實現思路,不代表任何被觀察到的 Swarm 一定可用、有效或被授權傳播。