如何检测种子内部以及跨种子的重复文件?

如何检测种子内部以及跨种子的重复文件?

如果我正在下载一堆种子,有没有办法或客户端可以检测已下载的文件并停止下载?

编辑: 从评论中澄清。是的,这意味着在不同的种子之间找到重复的文件并避免下载它们。

我知道有些客户端允许您选择要下载 torrent 中的哪些文件。在下载 torrent 之前,是否可以获取单个文件的校验和?如果可以,我可以编写一个脚本或类似的东西。

答案1

无法根据 .torrent 文件中的数据确定一个 torrent 中的文件是否也存在于另一个 torrent 中。标准 BitTorrent 协议中根本不支持重复数据删除。

当创建一个 torrent 时,其中的所有文件被连接在一起,然后被分成几块。

example:
Files  |---#1|#2|---#3|-----------------------#4|#5|------#6|-----#7|-------#8|
Pieces |--0|--1|--2|--3|--4|--5|--6|--7|--8|--9|-10|-11|-12|-13|-14|-15|-16|17|
  • 除最后一个部分外,所有部分的长度均相同。
  • 一个文件有一个或多个片段。
  • 一个片段可能包含多个文件(的部分)。
  • 内部文件和片段边界对齐的情况非常少见(除非使用填充文件)。
  • 多文件 torrent 中的一个文件几乎总是有一个与另一个文件共享的部分。

问题是不可能从片段哈希创建文件哈希。

(@jdwolf 即使文件 #1 和文件 #3 相同,它们的所有片段哈希值也会不同。)

有一些 torrent 创建程序可以选择添加文件哈希值,但据我所知它在任何地方都没有使用。

答案2

正如@encombe 提到的,第一个 BitTorrent 协议版本不提供重复数据删除功能。

另一方面,版本 2 带有嵌入式文件哈希,它们不是 sha256 流,而更像是经过修改(带有额外的填充数据)。

他们称之为 BTMR(BitTorrent Merkle Root)哈希。

这些键位于文件树属性内的信息字典中,并通过pieces root二进制编码字段访问。

还有工具来提取它们。

BTMR 哈希示例(未解码):

图像

相关内容