2011-06-29 32 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)); 

如果你得到一个不同的哈希值,那么你正在加载的文件不正确。