📄 fast extension.mht
字号:
<P>Let <I>k</I> denote the final number of pieces in the allowed fast =
set. </P><PRE> x =3D 0xFFFFFF00 & ip (1)
x.append(infohash) (2)
while |a| < k:=20
x =3D SHA1(x) (3)
for i in [0:5] and |a| < k: (4)
j =3D i*4 (5)
y =3D x[j:j+4] (6)
index =3D y % sz (7)
if index not in a: (8)
add index to a (9)
</PRE>
<P>Step (1) selects the most significant octets in peer <I>P'</I>s ip =
address.=20
We do this to prevent a user that obtains more than one IP address on =
the same=20
network from obtaining more than one <I>allowed fast set.</I> Use of =
three bytes=20
is heuristic and historical. </P>
<P>Step (3) generates a 20-byte random number on each call. By =
performing a=20
SHA-1 hash on the previous iteration's hash, we can generate an =
arbitrarily long=20
pseudorandom sequence. </P>
<P>Steps (4) through (9) partition the 20-byte hash into piece indices =
and add=20
them to the allowed fast set. </P></DIV><A =
name=3DExample_Implementation></A>
<H2>Example Implementation </H2>
<P>The following C++ implementation was provided by CacheLogic: =
</P><PRE>void generate_fast_set(
uint32 k, // number of pieces in set
uint32 sz, // number of pieces in torrent
const char infohash[20], // infohash of torrent
uint32 ip, // in host byte order, ie localhost is 0x7f000001
std::vector<uint32> &a) // generated set of piece indices
{
a.clear();
std::string x;
char buf[4];
*(uint32*)buf =3D htonl(ip & 0xffffff00);
x.assign(buf, 4);
x.append(infohash, 20); // (3)
while (a.size()<k) {
x =3D SHA1(x); // (4)
for ( int i=3D0 ; i<5 && a.size()<k ; i++ ) =
{ // (5)
int j =3D i*4; // (6)
uint32 y =3D ntohl(*(uint32*)(x.data()+j)); // (7)
uint32 index =3D y % sz; // (8)
if (std::find(a.begin(), a.end(), index)=3D=3Da.end()) { // (9)
a.push_back(index); // (10)
}
}
}
}
</PRE>
<P>Example results generated by this function: </P><PRE>7 piece allowed =
fast set for torrent with 1313 pieces and hex infohash =20
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa for node with IP 80.4.4.200:
1059,431,808,1217,287,376,1188
9 piece allowed fast set for torrent with 1313 pieces and hex infohash =
=20
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa for node with IP 80.4.4.200:
1059,431,808,1217,287,376,1188,353,508
</PRE></DIV><!-- ### End Content ### --></DIV>
<DIV></DIV>
<DIV id=3Dfooter>
<HR>
<P>Copyright 2006 BitTorrent.org</P></DIV></BODY></HTML>
------=_NextPart_000_0005_01C7859D.6CEAB7F0
Content-Type: text/css;
charset="gb2312"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://www.bittorrent.org/css/screen.css
BODY {
PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; FONT: 10px/1.5em "Trebuchet MS",sans-serif; COLOR: #333; =
PADDING-TOP: 0px; BACKGROUND-COLOR: #666; TEXT-ALIGN: center
}
#upper {
PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: url(../img/bg.gif) =
#fff repeat-x 0px 0px; PADDING-BOTTOM: 60px; MARGIN: 0px; PADDING-TOP: =
60px
}
#wrap {
MARGIN: 0px auto; WIDTH: 700px; TEXT-ALIGN: left
}
#header {
MARGIN: 0px; WIDTH: 100%; BORDER-BOTTOM: #eee 2px solid
}
#nav {
PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0.5em; MARGIN: =
0px 0px 40px; PADDING-TOP: 0.5em; TEXT-ALIGN: right
}
#nav UL {
PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#nav LI {
PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; FONT-WEIGHT: =
bold; FONT-SIZE: 1.5em; PADDING-BOTTOM: 0px; MARGIN-LEFT: 1em; =
PADDING-TOP: 0px
}
#nav LI SPAN {
COLOR: #f60
}
#home-l UL {
PADDING-RIGHT: 0px; PADDING-LEFT: 2px; PADDING-BOTTOM: 10px; MARGIN: =
0px 0px 1.5em; PADDING-TOP: 0px
}
#home-c UL {
PADDING-RIGHT: 0px; PADDING-LEFT: 2px; PADDING-BOTTOM: 10px; MARGIN: =
0px 0px 1.5em; PADDING-TOP: 0px
}
#home-r UL {
PADDING-RIGHT: 0px; PADDING-LEFT: 2px; PADDING-BOTTOM: 10px; MARGIN: =
0px 0px 1.5em; PADDING-TOP: 0px
}
#home-l LI {
PADDING-RIGHT: 0px; PADDING-LEFT: 25px; FONT-SIZE: 1.5em; BACKGROUND: =
url(../img/li.gif) no-repeat 0px 0px; PADDING-BOTTOM: 0px; MARGIN: 1em =
0px; LINE-HEIGHT: 1.2em; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#home-c LI {
PADDING-RIGHT: 0px; PADDING-LEFT: 25px; FONT-SIZE: 1.5em; BACKGROUND: =
url(../img/li.gif) no-repeat 0px 0px; PADDING-BOTTOM: 0px; MARGIN: 1em =
0px; LINE-HEIGHT: 1.2em; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#home-r LI {
PADDING-RIGHT: 0px; PADDING-LEFT: 25px; FONT-SIZE: 1.5em; BACKGROUND: =
url(../img/li.gif) no-repeat 0px 0px; PADDING-BOTTOM: 0px; MARGIN: 1em =
0px; LINE-HEIGHT: 1.2em; PADDING-TOP: 0px; LIST-STYLE-TYPE: none
}
#second LI {
FONT-SIZE: 10pt; MARGIN: 0.4em 0px; LINE-HEIGHT: 12pt
}
#second DT {
FONT-SIZE: 10pt; MARGIN: 0.4em 0px; LINE-HEIGHT: 12pt
}
#second DD {
FONT-SIZE: 1.2em; MARGIN-BOTTOM: 7px; LINE-HEIGHT: 1.5em
}
#intro {
PADDING-RIGHT: 3em; PADDING-LEFT: 3em; FONT-SIZE: 2.5em; =
PADDING-BOTTOM: 0px; MARGIN: 0px 0px 2.5em; COLOR: #000; LINE-HEIGHT: =
1.2em; PADDING-TOP: 0px
}
#footer {
PADDING-RIGHT: 0px; PADDING-LEFT: 0px; BACKGROUND: url(../img/fbg.gif) =
repeat-x 0px 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; =
HEIGHT: 60px
}
#home-l {
FLOAT: left; MARGIN: 0px 10px; WIDTH: 210px
}
#home-c {
FLOAT: left; MARGIN: 0px 10px; WIDTH: 210px
}
#home-r {
FLOAT: left; MARGIN: 0px 10px; WIDTH: 210px
}
#blog {
PADDING-RIGHT: 7em; PADDING-LEFT: 7em; PADDING-BOTTOM: 0px; =
PADDING-TOP: 0px
}
H1 {
FONT-WEIGHT: normal; FONT-SIZE: 3em; MARGIN: 0.3em 0px; LETTER-SPACING: =
-1px
}
H1 SPAN {
FONT-WEIGHT: bold; COLOR: #09f
}
H2 {
PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.7em; =
PADDING-BOTTOM: 0.5em; MARGIN: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: =
#ffc 2px solid
}
#second H2 {
BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; FONT-SIZE: 2em; =
BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0.5em; MARGIN: 0px; =
PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
}
#blog H2 {
BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; =
FONT-WEIGHT: normal; BORDER-LEFT-WIDTH: 0px; FONT-SIZE: 2em; =
BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0.5em; MARGIN: 0px; =
PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px
}
H3 {
FONT-SIZE: 1.5em; LINE-HEIGHT: 1.5em
}
H4 {
FONT-SIZE: 1.2em; TEXT-TRANSFORM: uppercase
}
H5 {
FONT-SIZE: 1.2em; COLOR: #666
}
#second P {
FONT-SIZE: 1.3em; LINE-HEIGHT: 1.5em
}
#blog P {
FONT-SIZE: 1.3em; LINE-HEIGHT: 1.5em
}
#footer P {
PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 2em; MARGIN: =
0px; COLOR: #fff; PADDING-TOP: 2em
}
TABLE {
BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
TD {
PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-SIZE: 9pt; =
PADDING-BOTTOM: 10px; PADDING-TOP: 10px
}
TD.shade {
BACKGROUND-COLOR: #eee
}
#blog .post {
PADDING-RIGHT: 0px; BORDER-TOP: #ffc 2px solid; PADDING-LEFT: 0px; =
FONT-SIZE: 1em; PADDING-BOTTOM: 5px; COLOR: #999; PADDING-TOP: 5px
}
.clear:unknown {
CLEAR: both; DISPLAY: block; FONT-SIZE: 0px; VISIBILITY: hidden; =
HEIGHT: 0px; content: "."
}
.clear {
=09
}
HTML .clear {
HEIGHT: 1%
}
.clear {
DISPLAY: block
}
.img-r {
FLOAT: right; PADDING-BOTTOM: 10px; MARGIN: 0px 0px 0px 20px; WIDTH: =
300px
}
.img-l {
FLOAT: left; PADDING-BOTTOM: 10px; MARGIN: 0px 20px 0px 0px; WIDTH: =
300px
}
#second .img-l P {
FONT-SIZE: 1.5em; COLOR: #09f; TEXT-ALIGN: center
}
#second .img-r P {
FONT-SIZE: 1.5em; COLOR: #09f; TEXT-ALIGN: center
}
HR {
DISPLAY: none
}
CODE {
COLOR: #963
}
A {
COLOR: #345; BORDER-BOTTOM: #eee 1px solid; TEXT-DECORATION: none
}
A:visited {
COLOR: #678
}
#nav A:visited {
COLOR: #345
}
A:hover {
COLOR: #f60
}
#nav A:hover {
COLOR: #f60
}
H1 A {
BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; COLOR: #666; BORDER-RIGHT-WIDTH: 0px
}
H1 A:visited {
BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; COLOR: #666; BORDER-RIGHT-WIDTH: 0px
}
H1 A:hover {
BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; COLOR: #666; BORDER-RIGHT-WIDTH: 0px
}
A IMG {
BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: =
0px; BORDER-RIGHT-WIDTH: 0px
}
------=_NextPart_000_0005_01C7859D.6CEAB7F0--
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -