Using FNV hash

This commit is contained in:
Dennis Schwerdel 2016-03-29 10:45:54 +02:00
parent dffdd4fd0a
commit c11d5b4d6e
7 changed files with 74 additions and 31 deletions

View File

@ -14,6 +14,7 @@ This project follows [semantic versioning](http://semver.org).
- [changed] New measurements - [changed] New measurements
- [changed] Only calling crypto_init once - [changed] Only calling crypto_init once
- [changed] Passing listen address as &str - [changed] Passing listen address as &str
- [changed] Using FNV hash for better performance
- [fixed] Fixed wrong hex address formatting - [fixed] Fixed wrong hex address formatting
- [fixed] Fixed peer exchange for more than 65000 peers - [fixed] Fixed peer exchange for more than 65000 peers
- [fixed] Initializing crypto for benchmarks - [fixed] Initializing crypto for benchmarks

72
Cargo.lock generated
View File

@ -5,11 +5,12 @@ dependencies = [
"aligned_alloc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "aligned_alloc 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
"docopt 0.6.78 (registry+https://github.com/rust-lang/crates.io-index)", "docopt 0.6.78 (registry+https://github.com/rust-lang/crates.io-index)",
"epoll 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "epoll 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
"gcc 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "gcc 0.3.26 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
"nix 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "nix 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"pkg-config 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)",
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
"signal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "signal 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
@ -30,8 +31,8 @@ version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -39,12 +40,17 @@ name = "bitflags"
version = "0.3.3" version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "bitflags"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "docopt" name = "docopt"
version = "0.6.78" version = "0.6.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"regex 0.1.51 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.1.59 (registry+https://github.com/rust-lang/crates.io-index)",
"rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)",
"strsim 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@ -55,7 +61,7 @@ version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"errno 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "errno 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -64,13 +70,18 @@ version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "fnv"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "gcc" name = "gcc"
version = "0.3.24" version = "0.3.26"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
@ -78,7 +89,7 @@ name = "kernel32-sys"
version = "0.2.1" version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
@ -89,7 +100,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.7" version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
@ -97,7 +108,7 @@ name = "log"
version = "0.3.5" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -105,9 +116,14 @@ name = "memchr"
version = "0.1.10" version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "mempool"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "nix" name = "nix"
version = "0.4.2" version = "0.4.2"
@ -117,9 +133,18 @@ dependencies = [
"libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]]
name = "nix"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"bitflags 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "pkg-config" name = "pkg-config"
version = "0.3.6" version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
@ -127,23 +152,24 @@ name = "rand"
version = "0.3.14" version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "regex" name = "regex"
version = "0.1.51" version = "0.1.59"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"aho-corasick 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "aho-corasick 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"memchr 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
"regex-syntax 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "mempool 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"regex-syntax 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.2.3" version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
@ -172,8 +198,8 @@ version = "0.1.34"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
] ]
[[package]] [[package]]
@ -183,7 +209,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "winapi" name = "winapi"
version = "0.2.5" version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]

View File

@ -17,14 +17,15 @@ rustc-serialize = "0.3"
log = "0.3" log = "0.3"
epoll = "0.2" epoll = "0.2"
signal = "0.1" signal = "0.1"
nix = "0.4" nix = "0.5"
libc = "0.2" libc = "0.2"
aligned_alloc = "0.1.1" aligned_alloc = "0.1.1"
rand = "0.3" rand = "0.3"
fnv = "1"
[build-dependencies] [build-dependencies]
gcc = "0.3" gcc = "0.3"
pkg-config = "0.3.6" pkg-config = "0.3"
[features] [features]
default = [] default = []

View File

@ -11,7 +11,9 @@ use std::io::Result as IoResult;
use std::fmt; use std::fmt;
use std::os::unix::io::AsRawFd; use std::os::unix::io::AsRawFd;
use std::marker::PhantomData; use std::marker::PhantomData;
use std::hash::BuildHasherDefault;
use fnv::FnvHasher;
use epoll; use epoll;
use nix::sys::signal::{SIGTERM, SIGQUIT, SIGINT}; use nix::sys::signal::{SIGTERM, SIGQUIT, SIGINT};
use signal::trap::Trap; use signal::trap::Trap;
@ -24,14 +26,16 @@ use super::udpmessage::{encode, decode, Options, Message};
use super::crypto::Crypto; use super::crypto::Crypto;
use super::util::{now, Time, Duration}; use super::util::{now, Time, Duration};
type Hash = BuildHasherDefault<FnvHasher>;
struct PeerList { struct PeerList {
timeout: Duration, timeout: Duration,
peers: HashMap<SocketAddr, Time> peers: HashMap<SocketAddr, Time, Hash>
} }
impl PeerList { impl PeerList {
fn new(timeout: Duration) -> PeerList { fn new(timeout: Duration) -> PeerList {
PeerList{peers: HashMap::new(), timeout: timeout} PeerList{peers: HashMap::default(), timeout: timeout}
} }
fn timeout(&mut self) -> Vec<SocketAddr> { fn timeout(&mut self) -> Vec<SocketAddr> {

View File

@ -4,6 +4,9 @@
use std::net::SocketAddr; use std::net::SocketAddr;
use std::collections::HashMap; use std::collections::HashMap;
use std::hash::BuildHasherDefault;
use fnv::FnvHasher;
use super::types::{Error, Table, Protocol, Address}; use super::types::{Error, Table, Protocol, Address};
use super::util::{now, Time, Duration}; use super::util::{now, Time, Duration};
@ -48,15 +51,17 @@ struct SwitchTableValue {
timeout: Time timeout: Time
} }
type Hash = BuildHasherDefault<FnvHasher>;
pub struct SwitchTable { pub struct SwitchTable {
table: HashMap<Address, SwitchTableValue>, table: HashMap<Address, SwitchTableValue, Hash>,
cache: Option<(Address, SocketAddr)>, cache: Option<(Address, SocketAddr)>,
timeout: Duration timeout: Duration
} }
impl SwitchTable { impl SwitchTable {
pub fn new(timeout: Duration) -> Self { pub fn new(timeout: Duration) -> Self {
SwitchTable{table: HashMap::new(), cache: None, timeout: timeout} SwitchTable{table: HashMap::default(), cache: None, timeout: timeout}
} }
} }

View File

@ -5,6 +5,9 @@
use std::net::SocketAddr; use std::net::SocketAddr;
use std::collections::{hash_map, HashMap}; use std::collections::{hash_map, HashMap};
use std::io::Read; use std::io::Read;
use std::hash::BuildHasherDefault;
use fnv::FnvHasher;
use super::types::{Protocol, Error, Table, Address}; use super::types::{Protocol, Error, Table, Address};
@ -47,11 +50,13 @@ struct RoutingEntry {
prefix_len: u8 prefix_len: u8
} }
pub struct RoutingTable(HashMap<Vec<u8>, Vec<RoutingEntry>>); type Hash = BuildHasherDefault<FnvHasher>;
pub struct RoutingTable(HashMap<Vec<u8>, Vec<RoutingEntry>, Hash>);
impl RoutingTable { impl RoutingTable {
pub fn new() -> Self { pub fn new() -> Self {
RoutingTable(HashMap::new()) RoutingTable(HashMap::default())
} }
} }

View File

@ -13,6 +13,7 @@ extern crate nix;
extern crate libc; extern crate libc;
extern crate aligned_alloc; extern crate aligned_alloc;
extern crate rand; extern crate rand;
extern crate fnv;
#[cfg(feature = "bench")] extern crate test; #[cfg(feature = "bench")] extern crate test;
#[macro_use] mod util; #[macro_use] mod util;