Expand description
A BitTorrent
InfoHash
. It’s a unique identifier for a BitTorrent
torrent.
“The 20-byte sha1 hash of the bencoded form of the info value from the metainfo file.”
See BEP 3. The BitTorrent
Protocol Specification
for the official specification.
This modules provides a type that can be used to represent info-hashes.
NOTICE: It only supports Info Hash v1.
Typically info-hashes are represented as hex strings, but internally they are a 20-byte array.
§Calculating the info-hash of a torrent file
A sample torrent:
- Torrent file:
mandelbrot_2048x2048_infohash_v1.png.torrent
- File:
mandelbrot_2048x2048.png
- Info Hash v1:
5452869be36f9f3350ccee6b4544e7e76caaadab
- Sha1 hash of the info dictionary:
5452869BE36F9F3350CCEE6B4544E7E76CAAADAB
A torrent file is a binary file encoded with Bencode encoding:
0000000: 6431 303a 6372 6561 7465 6420 6279 3138 d10:created by18
0000010: 3a71 4269 7474 6f72 7265 6e74 2076 342e :qBittorrent v4.
0000020: 342e 3131 333a 6372 6561 7469 6f6e 2064 4.113:creation d
0000030: 6174 6569 3136 3739 3637 3436 3238 6534 atei1679674628e4
0000040: 3a69 6e66 6f64 363a 6c65 6e67 7468 6931 :infod6:lengthi1
0000050: 3732 3230 3465 343a 6e61 6d65 3234 3a6d 72204e4:name24:m
0000060: 616e 6465 6c62 726f 745f 3230 3438 7832 andelbrot_2048x2
0000070: 3034 382e 706e 6731 323a 7069 6563 6520 048.png12:piece
0000080: 6c65 6e67 7468 6931 3633 3834 6536 3a70 lengthi16384e6:p
0000090: 6965 6365 7332 3230 3a7d 9171 0d9d 4dba ieces220:}.q..M.
00000a0: 889b 5420 54d5 2672 8d5a 863f e121 df77 ..T T.&r.Z.?.!.w
00000b0: c7f7 bb6c 7796 2166 2538 c5d9 cdab 8b08 ...lw.!f%8......
00000c0: ef8c 249b b2f5 c4cd 2adf 0bc0 0cf0 addf ..$.....*.......
00000d0: 7290 e5b6 414c 236c 479b 8e9f 46aa 0c0d r...AL#lG...F...
00000e0: 8ed1 97ff ee68 8b5f 34a3 87d7 71c5 a6f9 .....h._4...q...
00000f0: 8e2e a631 7cbd f0f9 e223 f9cc 80af 5400 ...1|....#....T.
0000100: 04f9 8569 1c77 89c1 764e d6aa bf61 a6c2 ...i.w..vN...a..
0000110: 8099 abb6 5f60 2f40 a825 be32 a33d 9d07 ...._`/@.%.2.=..
0000120: 0c79 6898 d49d 6349 af20 5866 266f 986b .yh...cI. Xf&o.k
0000130: 6d32 34cd 7d08 155e 1ad0 0009 57ab 303b m24.}..^....W.0;
0000140: 2060 c1dc 1287 d6f3 e745 4f70 6709 3631 `.......EOpg.61
0000150: 55f2 20f6 6ca5 156f 2c89 9569 1653 817d U. .l..o,..i.S.}
0000160: 31f1 b6bd 3742 cc11 0bb2 fc2b 49a5 85b6 1...7B.....+I...
0000170: fc76 7444 9365 65 .vtD.ee
You can generate that output with the command:
xxd mandelbrot_2048x2048_infohash_v1.png.torrent
And you can show only the bytes (hexadecimal):
6431303a6372656174656420627931383a71426974746f7272656e742076
342e342e3131333a6372656174696f6e2064617465693136373936373436
323865343a696e666f64363a6c656e6774686931373232303465343a6e61
6d6532343a6d616e64656c62726f745f3230343878323034382e706e6731
323a7069656365206c656e67746869313633383465363a70696563657332
32303a7d91710d9d4dba889b542054d526728d5a863fe121df77c7f7bb6c
779621662538c5d9cdab8b08ef8c249bb2f5c4cd2adf0bc00cf0addf7290
e5b6414c236c479b8e9f46aa0c0d8ed197ffee688b5f34a387d771c5a6f9
8e2ea6317cbdf0f9e223f9cc80af540004f985691c7789c1764ed6aabf61
a6c28099abb65f602f40a825be32a33d9d070c796898d49d6349af205866
266f986b6d3234cd7d08155e1ad0000957ab303b2060c1dc1287d6f3e745
4f706709363155f220f66ca5156f2c8995691653817d31f1b6bd3742cc11
0bb2fc2b49a585b6fc767444936565
You can generate that output with the command:
`xxd -ps mandelbrot_2048x2048_infohash_v1.png.torrent`.
The same data can be represented in a JSON format:
{
"created by": "qBittorrent v4.4.1",
"creation date": 1679674628,
"info": {
"length": 172204,
"name": "mandelbrot_2048x2048.png",
"piece length": 16384,
"pieces": "<hex>7D 91 71 0D 9D 4D BA 88 9B 54 20 54 D5 26 72 8D 5A 86 3F E1 21 DF 77 C7 F7 BB 6C 77 96 21 66 25 38 C5 D9 CD AB 8B 08 EF 8C 24 9B B2 F5 C4 CD 2A DF 0B C0 0C F0 AD DF 72 90 E5 B6 41 4C 23 6C 47 9B 8E 9F 46 AA 0C 0D 8E D1 97 FF EE 68 8B 5F 34 A3 87 D7 71 C5 A6 F9 8E 2E A6 31 7C BD F0 F9 E2 23 F9 CC 80 AF 54 00 04 F9 85 69 1C 77 89 C1 76 4E D6 AA BF 61 A6 C2 80 99 AB B6 5F 60 2F 40 A8 25 BE 32 A3 3D 9D 07 0C 79 68 98 D4 9D 63 49 AF 20 58 66 26 6F 98 6B 6D 32 34 CD 7D 08 15 5E 1A D0 00 09 57 AB 30 3B 20 60 C1 DC 12 87 D6 F3 E7 45 4F 70 67 09 36 31 55 F2 20 F6 6C A5 15 6F 2C 89 95 69 16 53 81 7D 31 F1 B6 BD 37 42 CC 11 0B B2 FC 2B 49 A5 85 B6 FC 76 74 44 93</hex>"
}
}
The JSON object was generated with: https://github.com/Chocobo1/bencode_online
As you can see, there is a info
attribute:
{
"length": 172204,
"name": "mandelbrot_2048x2048.png",
"piece length": 16384,
"pieces": "<hex>7D 91 71 0D 9D 4D BA 88 9B 54 20 54 D5 26 72 8D 5A 86 3F E1 21 DF 77 C7 F7 BB 6C 77 96 21 66 25 38 C5 D9 CD AB 8B 08 EF 8C 24 9B B2 F5 C4 CD 2A DF 0B C0 0C F0 AD DF 72 90 E5 B6 41 4C 23 6C 47 9B 8E 9F 46 AA 0C 0D 8E D1 97 FF EE 68 8B 5F 34 A3 87 D7 71 C5 A6 F9 8E 2E A6 31 7C BD F0 F9 E2 23 F9 CC 80 AF 54 00 04 F9 85 69 1C 77 89 C1 76 4E D6 AA BF 61 A6 C2 80 99 AB B6 5F 60 2F 40 A8 25 BE 32 A3 3D 9D 07 0C 79 68 98 D4 9D 63 49 AF 20 58 66 26 6F 98 6B 6D 32 34 CD 7D 08 15 5E 1A D0 00 09 57 AB 30 3B 20 60 C1 DC 12 87 D6 F3 E7 45 4F 70 67 09 36 31 55 F2 20 F6 6C A5 15 6F 2C 89 95 69 16 53 81 7D 31 F1 B6 BD 37 42 CC 11 0B B2 FC 2B 49 A5 85 B6 FC 76 74 44 93</hex>"
}
The info-hash is the SHA1 hash
of the info
attribute. That is, the SHA1 hash of:
64363a6c656e6774686931373232303465343a6e61
d6532343a6d616e64656c62726f745f3230343878323034382e706e6731
23a7069656365206c656e67746869313633383465363a70696563657332
2303a7d91710d9d4dba889b542054d526728d5a863fe121df77c7f7bb6c
79621662538c5d9cdab8b08ef8c249bb2f5c4cd2adf0bc00cf0addf7290
5b6414c236c479b8e9f46aa0c0d8ed197ffee688b5f34a387d771c5a6f9
e2ea6317cbdf0f9e223f9cc80af540004f985691c7789c1764ed6aabf61
6c28099abb65f602f40a825be32a33d9d070c796898d49d6349af205866
66f986b6d3234cd7d08155e1ad0000957ab303b2060c1dc1287d6f3e745
f706709363155f220f66ca5156f2c8995691653817d31f1b6bd3742cc11
bb2fc2b49a585b6fc7674449365
You can hash that byte string with https://www.pelock.com/products/hash-calculator
The result is a 20-char string: 5452869BE36F9F3350CCEE6B4544E7E76CAAADAB
Structs§
- Info
Hash BitTorrent
Info Hash v1
Enums§
- Conversion
Error - Errors that can occur when converting from a
Vec<u8>
to anInfoHash
.