【问题标题】:The torrent info_hash parameter洪流 info_hash 参数
【发布时间】:2012-04-28 19:22:36
【问题描述】:

如何计算 info_hash 参数?又名信息字典对应的hash??

来自官方规格:

info_hash 元信息文件中信息值的编码形式的 20 字节 sha1 散列。请注意,这是元信息文件的子字符串。 这个值几乎肯定会被转义。

这是否意味着只需从元信息文件中获取子字符串并对代表字节进行 sha-1 哈希处理??

....因为这是我尝试 12 次但没有成功的方式,这意味着我已经将生成的哈希与我最终应该得到的哈希进行了比较..它们不同.. + 跟踪器响应是 FAILURE,unknown torrent。 ..什么的

那么如何计算 info_hash?

【问题讨论】:

    标签: hash bittorrent url-parameters


    【解决方案1】:

    元文件已经被编码了,所以我不明白你为什么要重新编码?

    我终于在 Java 代码中得到了这个工作,这是我的代码:

    byte metaData[];  //the raw .torrent file
    
    int infoIdx = ?;  //index of 'd' right after the "4:info" string
    
    info_hash = SHAsum(Arrays.copyOfRange(metaData, infoIdx, metaData.length-1));
    

    假设“信息”块是种子文件中的最后一个块(错误?)

    不要排序或类似的东西,只需使用原始种子文件的子字符串。

    为我工作。

    【讨论】:

    • 在多个站点上发现这是一个解决方案。这假设 .torrent 是按规则构建的(对所有 dicts 进行排序),除非是由我的愚蠢应用程序制作的,否则这应该始终是正确的。 .但无论如何我最终使用了另一个 bencoding 库 & 现在一切正常(阅读和创建).. 感谢您的回答
    • @pulancheck1988 但您必须对信息结构中的字典键进行排序,否则信息哈希计算将不正确。因此,如果您必须对信息结构中的键进行排序,那么您不妨在各处进行排序。
    • @b0fh 在计算 info_hash 时对未排序的 info dict 进行排序实际上是错误的。 See my comment here.
    • 你有一个例子,其中“信息”块不是最后一个:webtorrent.io/torrents/sintel.torrent 它后面有一个“url-list”键。
    【解决方案2】:

    bdecode 元文件。然后就是sha1(bencode(metadata['info'])) (即再次只对 info dict 进行编码,然后对其进行哈希处理)。

    【讨论】:

    • 这正是我所做的......我使用这个库:bencode.codeplex.com ..BDict 有一个方法字符串 Encode(),它为一个字典生成了对应的字符串......我将其用于信息字典 + 获取字节(尝试使用编码 UTF-8、ASCII 的展位).. 并对这些字节进行哈希处理.. 仍然没有得到正确的哈希
    • 你对 dict 进行排序会有所帮助吗……在当前的实现中,编码没有排序?以及如何根据 torrent 规范按字符串排序..
    • 如果这正是您所做的,那么您的代码中存在错误,如果您希望任何人为您找到它,您必须发布代码。
    • BEP-3 要求对键进行排序,并且非常清楚编码始终是 UTF-8,排序是通过比较编码字节来进行的,没有任何排序。如果上述方法不起作用并提供了错误的哈希值,则说明您的库存在错误并需要进行一些单元测试。
    • BEP-3 已更新,现在说:“info_hash - 元信息文件中信息值的 20 字节 sha1 哈希值。请注意,这是元信息文件的子字符串。 info-hash 必须是 .torrent 文件中编码形式的哈希值,无论它是否无效。 " more info
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多