创建torrent文件的信息哈希的问题

时间:2011-06-29 21:16:13

标签: php bittorrent info-hash

我正在创建一个BitTorrent网站。

如果用户上传.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)上,它仍然无效。

我已经尝试过替换换行符/回车。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我能够使用PHP 5.3.x在Windows XP和7上运行代码,并获得正确的哈希值。我猜你在Windows上加载的.torrent与你在Linux上加载的那个不同(可能是编码问题)。

尝试运行此代码,看看是否收到SHA1哈希值148251317dae971fcd5a5dcc5d4bde3d85130c8f

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

我将假设:

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

如果你得到一个不同的哈希值,那么你加载的文件就不对了。

答案 1 :(得分: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.