extern crate rand;
extern crate time;
extern crate fnv;

#[macro_use]
mod utils;

use rand::*;
use std::collections::{HashMap};
use std::hash::BuildHasherDefault;
use fnv::FnvHasher;

type Hasher = BuildHasherDefault<FnvHasher>;

fn main() {
    let mut m: HashMap<_, _, Hasher> = HashMap::default();
    let mut rnd = rand::thread_rng();
    let source = (1..50_000_000).map(|_| rnd.gen::<i32>()).collect::<Vec<_>>();
    
    time!("Insertion", {
        for x in source.iter().cloned() {
            m.entry(x).or_insert(0);
        }
    });
    
    time!("Lookup", {
        let mut _acc = 0;
        for x in source.iter() {
            if let Some(x) = m.get(x) {
                _acc += x % 10
            }
        }
    })
}

// Insertion: PT8.113402537S elapsed.
// Lookup: PT3.419989949S elapsed.