bt种子的hansh值计算,近期忽然对bt种子感兴趣了(原因勿问)

1. bt种子(概念)

bt 是一个分布式文件分发协议,每一个文件下载者在下载的同一时候向其他下载者不断的上传已经下载的数据,这样保证下载越快,上传越快,从而实现告诉下载

2. bt 怎样实现下载同一时候上传文件

这个须要从文件本身说起,bt文件包括了两部分信息,一部分是Tracker信息,一部分是文件信息,tracker信息主要是记录下载过程中须要的trackerserver地址和针对trackerserver的设置,文件信息是依据对目标文件的计算生成的,计算结果会以B编码规则进行编码(英文不太好,这部分信息来自百度百科)。 文件信息里,会把须要下载的文件进行分块,每一个块的索引信息会写到torrent文件里,在这里上传一个迅雷的任务具体页面

能够看到详细的任务分块信息,每一个下载者都能够上传自己已经下载的分块数据,怎样获取其他下载者已经下载的分块信息数据呢,一种方式是通过trackerserver来实现的,能够记录每一个下载者,这也就是我们常常看见局域网的bt分享站点会有对上传下载的流量统计功能,每一个人下载多少,上传多少,从而确定每一个人的贡献值。

这也就是海盗湾之前被瑞典起诉的原因,trackerserver提供了给每一个下载者下载盗版的可能性和机会,当然如今对于众多的magnet协议,採用了dht技术,这样对于trackerserver的存在就显得没有必要了,这是后话,慢慢在描写叙述!

3.  bt的hash值计算(特征值计算)

由上可知,对于每个bt种子,都有包括每个分块的文件信息,这样能够保证即使在trackerserver有变化的情况下,bt种子的唯一性(这里,插一句,我以前simple的以为,能够对bt种子取md5值就能够确定其唯一性,too naive啊),那怎样计算这个hash值呢,这须要对bt文件组成的一个深入了解,这方面以后相当多的文章,附上一篇:

http://www.cnblogs.com/DxSoft/archive/2012/02/11/2346314.html

依据这篇文章的描写叙述,谢了两段測试程序:

方法1:直接依据info后的字段信息即4:info后的字段,我们能够截取bt种子中的一段

比如:

d8:announce27:http://tk3.5qzone.net:8080/13:announce-listll27:http://tk3.5qzone.net:8080/el36:http://btfans.3322.org:8000/announceel36:http://btfans.3322.org:8080/announceel36:http://btfans.3322.org:6969/announceel42:http://denis.stalker.h3q.com:6969/announceel40:http://torrent-download.to:5869/announceel45:http://tracker.openbittorrent.com:80/announceel39:http://tracker.publicbt.com:80/announceel40:http://tracker.bittorrent.am:80/announceel30:http://tracker.prq.to/announceel34:http://tracker.prq.to/announce.phpel43:http://tracker.torrentbox.com:2710/announceel34:http://tpb.tracker.prq.to/announceel30:http://tr.wjl.cn:8080/announceel37:http://219.152.120.234:6969/announce el34:http://mdbt.3322.org:6969/announceee7:comment19:YYeTs人人影视资源站13:comment.utf-826:YYeTs浜轰汉褰辫璧勬簮绔?0:created by13:BitComet/0.7013:creation datei1261532244e8:encoding3:GBK4:infod5:filesld6:lengthi943e4:path

第一个字节d代表dict意思,字典组成,4:info 代表着info字段长度为4意思,这样我们能够写下解析hash的代码值:

#!python
import hashlib
def sha1sum(src):
if not len(src):
return ""
m = hashlib.sha1(src)
return m.hexdigest() #filename is the torrent file name
with open(filename) as f:
torrent_data = f.read()
if -1 != torrent_data.find("nodes"):
info_data =
torrent_data[torrent_data.find("info")+4:torrent_data.find("nodes")-2]
else:
info_data =
torrent_data[torrent_data.find("info")+4:len(torrent_data) - 1]
sha1_data = sha1sum(info_data)
print "the hash data of torrent is: ", sha1_data.upper()

在实际測试时,发现,在torrent中,有两种情况,一种是包括nodes字段信息的;一种是不包括nodes信息的torrent种子,须要分别处理,可是这样的处理的方式较为繁琐,也不清楚兴许究竟有多少的坑在里面,须要应对不同情况,于是去google了一下,在stackoverflow里面,提到一个库,即bencode库,这就是我们的另外一种方案

方案2:

通过bencode库实现对hash值得计算(bencode库兴许具体介绍和解读),代码例如以下(须要安装bencode库),地址:

https://pypi.python.org/pypi/BitTorrent-bencode/5.0.8.1

#!/usr/bin/python

import sys, os, hashlib, StringIO
import bencode def main():
# Open torrent file
torrent_file = open(sys.argv[1], "rb")
metainfo = bencode.bdecode(torrent_file.read())
info = metainfo['info']
print hashlib.sha1(bencode.bencode(info)).hexdigest() if __name__ == "__main__":
main()

bt 介绍以及 bt 种子的hash值(特征值)计算的更多相关文章

  1. C++ 文件hash值 BT种子的hash值

    这个两个东东,是我在网上找到的.小小的修改了一下方便大家使用. 一个是 获取文件哈希值的,另外一个是获取torrent文件磁力链接的哈希值. 整理好的类下载地址: 文件hash值: http://pa ...

  2. hash值的计算与转换 分类: ACM TYPE 2015-05-07 17:49 36人阅读 评论(0) 收藏

    #include <bits/stdc++.h> using namespace std; const int MAXN = 100; const int X = 3; long long ...

  3. Hash值破解工具(findmyhash与hash-identifier破解Hash值)

    Hash值破解工具(findmyhash与hash-identifier破解Hash值) 前言: Kali Linux提供各种哈希密文破解工具,如hashcat.john.rainbows.不论哪一种 ...

  4. 根据hash值找到bt种子的磁力下载链

    根据hash值找到bt种子的磁力下载链- 画皮2 hash:E5757D533B3690774519E6A80021E43C03A58C0B 磁力 下载链接 如下: magnet:?xt=urn:bt ...

  5. Hash值破解工具Hashcat使用

    Hash值破解工具Hashcat使用 Hashcat介绍 HashCat系列软件拥有十分灵活的破解方式,可以满足绝大多数的破解需求. Hashcat系列软件是比较牛逼的密码破解软件,系列软件包含Has ...

  6. 痞子衡嵌入式:利用i.MXRT1xxx系列内部DCP引擎计算Hash值时需特别处理L1 D-Cache

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是利用i.MXRT1xxx系列内部DCP引擎计算Hash值时需特别处理L1 D-Cache. 关于i.MXRT1xxx系列内部通用数据协处 ...

  7. IOS9.0中hash值的bug与解决方案

    事件起因 事情是这样的:产品上线发布,突然出现了问题.运营Gg过来反应,当场给露珠演示,运营同事的手机是iphone,bug确实是存在的.奇怪的是露珠用了其他iphone手机(借别人的,露珠的是吊死安 ...

  8. JAVA-读取文件部分内容计算HASH值

    对于一些大文件,有时会需要计算部分内容的Hash,下面的函数计算了 文件头尾各1M,中间跳跃100M取10K 以及文件大小的Hash值 public static String CalHash(Str ...

  9. Java 获取字符串Hash值

    Java 生成字符串的Hash值: /** * A hashing method that changes a string (like a URL) into a hash suitable for ...

随机推荐

  1. fedora22 无法联网的情况下rpm安装gcc5.1

    前天发生件很不幸的事.我在给ubuntu14.04安装NVIDIA显卡驱动的时候,想清空下一个目录,什么目录我也忘了,当时我正好切到root身份(平常我很少切root的),命令格式如下 rm -fr ...

  2. git 创建多个账户ssh

    创建一个账户 创建ssh本地秘钥. $ ssh-keygen -t rsa -C "youremail@xxx.com" 一路回车,会在~/.ssh/目录下生成id_rsa和id_ ...

  3. Scut:账号服务器问题修正

    姑且记录一下,以防未来出现bug回来看看今天改了哪些. 原 Scut 账服是应用于 渠道频道 的账号服务器,每天会发放大量的游客账号,它有一个"自动将已经被注册了一段时间的游客账号再重新推送 ...

  4. Netty启动分析

    基于Netty-3.2.5 先看一段Netty的服务端代码: import java.net.InetSocketAddress; import java.util.concurrent.Execut ...

  5. C#(asp.net)备份还原mssql数据库代码【转】

    采集自互联网,未验证..... 如果我们使用虚拟主机为网站空间,这时如果需要备份和还原msssql数据库是非常麻烦,如果在网站后台管理当中加入对msssql数据库的操纵,可以使我们对数据库的备份和还原 ...

  6. Android项目无法运行的解决方法

    文件本身是否有问题 有两种方法可以判断:1.比较快捷的办法就是用解压软件打开或者解压的过程中有没有弹出什么错误提示,如果有错误提示那就重新下载一遍文件(javaapk用的压缩工具是winrar4.0, ...

  7. Contest20140705 testB DP

    testB 输入文件: testB.in 输出文件testB.out 时限2000ms 问题描述: 方师傅有两个由数字组成的串 a1,a2,⋯,an 和 b1,b2,⋯,bm.有一天,方师傅感到十分无 ...

  8. 听同事讲 Bayesian statistics: Part 1 - Bayesian vs. Frequentist

    听同事讲 Bayesian statistics: Part 1 - Bayesian vs. Frequentist   摘要:某一天与同事下班一同做地铁,刚到地铁站,同事遇到一熟人正从地铁站出来. ...

  9. iOS:关于获取网络类型和运营商信息

    目录 1. 获取运营商网络类型 2. 获取运营商信息 返回目录 1. 获取运营商网络类型 Apple的Reachability Sample看起来不错,但是只可以判断是否连接到互联网和是否连接Wifi ...

  10. document.body.clientWidth vs document.documentElement.clientWidth

    http://blog.csdn.net/zb0567/article/details/7182391 mobile web javascript library http://www.gbin1.c ...