2011-06-29 34 views
3

我正在創建一個BitTorrent網站。創建Torrent文件信息哈希的問題

如果用戶上傳.torrent文件我需要獲取信息哈希以從跟蹤器獲取更多信息。

但是我似乎無法從文件中獲取正確的信息哈希值。

我已經從mininova下載了一個.torrent(http://www.mininova.org/get/2886852)。

根據mininova信息哈希應該是:6a7eb42ab3b9781eba2d9ff3545d9758f27ec239(http://www.mininova.org/det/2886852)。但是,當我嘗試創建文件的信息散列時,我得到以下內容:3d05f149e604b1efaa0ed554a31e693755de7cb0

我沒有任何線索知道爲什麼我無法獲得正確的信息散列。

如果我理解正確,我必須從torrent數據的info部分創建哈希。

相關的代碼:

$bencode = new BencodeModel(); 
$data = $bencode->decode_file($form->fields['filename']->saved_file); 
$hash = $torrentmanager->create_hash($data['info']); 

的BencodeModel(太長,張貼在這裏):http://pastebin.com/Zc5i94DQ

的創建哈希函數:

function create_hash($info) 
{ 
    $bencode = new BencodeModel(); 
    return urlencode(sha1($bencode->encode($info))); 
} 

我完全在黑暗地方我出錯了。任何幫助深表感謝!

如果您需要更多信息,請告訴我,我會更新相關信息。

編輯

由於請求的數據爲SHA1:

var_dump($bencode->encode($info)); 

http://pastebin.com/HiQgRX6M

編輯

這是越來越奇怪。

我已經將該站點部署到運行在Linux服務器上的服務器,並且散列工作在那裏。

但是在我的開發機器(Windows)上它仍然不起作用。

我已經嘗試更換linebreaks /回車。

任何想法?

+0

這也將有助於告訴我們什麼你最終投入到'sha1'。 – Jon

+0

@Jon:有問題更新 – PeeHaa

+0

@hakre:因爲洪流只能有1個信息散列,並且它被用來'刮'信息。當我手動嘗試使用該散列獲取信息時,我得到了我需要的信息:http://tracker.mininova.org/scrape?info_hash=6a7eb42ab3b9781eba2d9ff3545d9758f27ec239 – PeeHaa

回答

0

torrent文件中的散列不能是文件的散列。考慮一下......散列是基於它的內容,並且你不能預先知道散列是什麼。因此,計算文件的散列值,然後將其嵌入到文件中會更改文件的散列值,從而使您剛剛嵌入的散列值失效。

.torrent文件中的散列基於文件的內容,但不是整個內容。

BT spec

info_hash 
    The 20 byte sha1 hash of the bencoded form of the info value from the metainfo file. Note that this is a substring of the metainfo file. This value will almost certainly have to be escaped. 
+0

torrent文件中沒有散列。我試圖從torrent文件中的信息計算散列。 – PeeHaa

+0

@PeeHaa:仔細閱讀關於什麼和在哪個編碼中需要創建哈希的規格。如果它確實符合您的期望,請參閱bencode課程。我很確定這個錯誤是根植於其中的。 – hakre

1

我能得到的代碼與PHP 5.3.x在Windows XP和7上運行,並得到正確的哈希值。我猜測你在Windows上加載的.torrent不同於你在Linux上加載的.torrent(可能是編碼問題)。

嘗試運行這段代碼,看看你得到的SHA1哈希148251317dae971fcd5a5dcc5d4bde3d85130c8f附和道:

echo sha1(file_get_contents('your.torrent')); 

,我會假設是:

echo sha1(file_get_contents($form->fields['filename']->saved_file)); 

如果你得到一個不同的哈希值,那麼你正在加載的文件不正確。