1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
use bincode::{Decode, Encode};
use karyons_net::{Addr, Port};
/// Specifies the size of the key, in bytes.
pub const KEY_SIZE: usize = 32;
/// An Entry represents a peer in the routing table.
#[derive(Encode, Decode, Clone, Debug)]
pub struct Entry {
/// The unique key identifying the peer.
pub key: Key,
/// The IP address of the peer.
pub addr: Addr,
/// TCP port
pub port: Port,
/// UDP/TCP port
pub discovery_port: Port,
}
impl PartialEq for Entry {
fn eq(&self, other: &Self) -> bool {
// XXX this should also compare both addresses (the self.addr == other.addr)
self.key == other.key
}
}
/// The unique key identifying the peer.
pub type Key = [u8; KEY_SIZE];
/// Calculates the XOR distance between two provided keys.
///
/// The XOR distance is a metric used in Kademlia to measure the closeness
/// of keys.
pub fn xor_distance(key: &Key, other: &Key) -> Key {
let mut res = [0; 32];
for (i, (k, o)) in key.iter().zip(other.iter()).enumerate() {
res[i] = k ^ o;
}
res
}
|