use array_init;
use rand;
use tab_hash::{Tab32Simple, Tab32Twisted, Tab64Simple, Tab64Twisted};
extern "C" {
fn SimpleTab32(x: u32, H: &[[u32; 256]; 4]) -> u32;
fn TwistedTab32(x: u32, H: &[[u64; 256]; 4]) -> u32;
fn SimpleTab64(x: u64, H: &[[u64; 256]; 8]) -> u64;
fn TwistedTab64(x: u64, H: &[[u128; 256]; 8]) -> u64;
}
#[test]
fn simple32_vs_reference_implementation() {
for _ in 0..100 {
let simple_tabhash = Tab32Simple::new();
let seed = simple_tabhash.get_table();
let random_keys: [u32; 100] = array_init::array_init(|_| rand::random());
for key in random_keys.iter() {
let rust_result = simple_tabhash.hash(*key);
unsafe {
let reference_result = SimpleTab32(*key, &seed);
assert_eq!(reference_result, rust_result);
}
}
}
}
#[test]
fn twisted32_vs_reference_implementation() {
for _ in 0..10 {
let twisted_tabhash = Tab32Twisted::new();
let seed = twisted_tabhash.get_table();
let random_keys: [u32; 100] = array_init::array_init(|_| rand::random());
for key in random_keys.iter() {
let rust_result = twisted_tabhash.hash(*key);
unsafe {
let reference_result = TwistedTab32(*key, &seed);
eprintln!("{}", reference_result);
assert_eq!(reference_result, rust_result);
}
}
}
}
#[test]
fn simple64_vs_reference_implementation() {
for _ in 0..100 {
let simple_tabhash = Tab64Simple::new();
let seed = simple_tabhash.get_table();
let random_keys: [u64; 100] = array_init::array_init(|_| rand::random());
for key in random_keys.iter() {
let rust_result = simple_tabhash.hash(*key);
unsafe {
let reference_result = SimpleTab64(*key, &seed);
assert_eq!(reference_result, rust_result);
}
}
}
}
#[test]
fn twisted64_vs_reference_implementation() {
for _ in 0..10 {
let twisted_tabhash = Tab64Twisted::new();
let seed = twisted_tabhash.get_table();
let random_keys: [u64; 100] = array_init::array_init(|_| rand::random());
for key in random_keys.iter() {
let rust_result = twisted_tabhash.hash(*key);
unsafe {
let reference_result = TwistedTab64(*key, &seed);
eprintln!("{}", reference_result);
assert_eq!(reference_result, rust_result);
}
}
}
}
#[test]
fn simple_vs_fixed_value() {
let key = 0b_00000100_00000010_00000001_00000000;
let mut byte_1 = [0; 256];
let mut byte_2 = [0; 256];
let mut byte_3 = [0; 256];
let mut byte_4 = [0; 256];
byte_1[0] = 7;
byte_2[1] = 11;
byte_3[2] = 13;
byte_4[4] = 17;
let table = [byte_1, byte_2, byte_3, byte_4];
let result = 16;
let simple_tabhash = Tab32Simple::with_table(table);
assert_eq!(simple_tabhash.hash(key), result);
}
#[test]
fn twisted_vs_fixed_value() {
let key = 0b_00000100_00000010_00000001_00000000;
let mut byte_1 = [0; 256];
let mut byte_2 = [0; 256];
let mut byte_3 = [0; 256];
let mut byte_4 = [0; 256];
byte_1[0] = 7;
byte_2[1] = 11;
byte_3[2] = 13;
byte_4[0b101] = 0x_00_00_00_01_80_00_00_00;
let table = [byte_1, byte_2, byte_3, byte_4];
let result = 1;
let simple_tabhash = Tab32Twisted::with_table(table);
assert_eq!(simple_tabhash.hash(key), result);
}
#[test]
fn simple32_to_and_from_vec() {
for _ in 0..1000 {
let h = Tab32Simple::new();
let table = h.to_vec();
let h2 = Tab32Simple::from_vec(table);
let t1 = h.get_table();
let t2 = h2.get_table();
for column in 0..4 {
assert_eq!(t1[column].to_vec(), t2[column].to_vec());
}
let random_keys: [u32; 100] = array_init::array_init(|_| rand::random());
for key in random_keys.iter() {
assert_eq!(h.hash(*key), h2.hash(*key));
}
}
}
#[test]
fn twisted32_to_and_from_vec() {
for _ in 0..1000 {
let h = Tab32Twisted::new();
let table = h.to_vec();
let h2 = Tab32Twisted::from_vec(table);
let t1 = h.get_table();
let t2 = h2.get_table();
for column in 0..4 {
assert_eq!(t1[column].to_vec(), t2[column].to_vec());
}
let random_keys: [u32; 100] = array_init::array_init(|_| rand::random());
for key in random_keys.iter() {
assert_eq!(h.hash(*key), h2.hash(*key));
}
}
}
#[test]
fn simple64_to_and_from_vec() {
for _ in 0..1000 {
let h = Tab64Simple::new();
let table = h.to_vec();
let h2 = Tab64Simple::from_vec(table);
let t1 = h.get_table();
let t2 = h2.get_table();
for column in 0..4 {
assert_eq!(t1[column].to_vec(), t2[column].to_vec());
}
let random_keys: [u64; 100] = array_init::array_init(|_| rand::random());
for key in random_keys.iter() {
assert_eq!(h.hash(*key), h2.hash(*key));
}
}
}
#[test]
fn twisted64_to_and_from_vec() {
for _ in 0..1000 {
let h = Tab64Twisted::new();
let table = h.to_vec();
let h2 = Tab64Twisted::from_vec(table);
let t1 = h.get_table();
let t2 = h2.get_table();
for column in 0..4 {
assert_eq!(t1[column].to_vec(), t2[column].to_vec());
}
let random_keys: [u64; 100] = array_init::array_init(|_| rand::random());
for key in random_keys.iter() {
assert_eq!(h.hash(*key), h2.hash(*key));
}
}
}
#[test]
fn simple32_serialization() {
for _ in 0..1000 {
let hf = Tab32Simple::new();
let serialized_hf = bincode::serialize(&hf).unwrap();
let deserialized_hf: Tab32Simple = bincode::deserialize(&serialized_hf).unwrap();
let t1 = hf.get_table();
let t2 = deserialized_hf.get_table();
for column in 0..4 {
assert_eq!(t1[column].to_vec(), t2[column].to_vec());
}
let random_keys: [u32; 100] = array_init::array_init(|_| rand::random());
for key in random_keys.iter() {
assert_eq!(hf.hash(*key), deserialized_hf.hash(*key));
}
}
}
#[test]
fn simple64_serialization() {
for _ in 0..1000 {
let hf = Tab64Simple::new();
let serialized_hf = bincode::serialize(&hf).unwrap();
let deserialized_hf: Tab64Simple = bincode::deserialize(&serialized_hf).unwrap();
let t1 = hf.get_table();
let t2 = deserialized_hf.get_table();
for column in 0..4 {
assert_eq!(t1[column].to_vec(), t2[column].to_vec());
}
let random_keys: [u64; 100] = array_init::array_init(|_| rand::random());
for key in random_keys.iter() {
assert_eq!(hf.hash(*key), deserialized_hf.hash(*key));
}
}
}
#[test]
fn twisted32_serialization() {
for _ in 0..1000 {
let hf = Tab32Twisted::new();
let serialized_hf = bincode::serialize(&hf).unwrap();
let deserialized_hf: Tab32Twisted = bincode::deserialize(&serialized_hf).unwrap();
let t1 = hf.get_table();
let t2 = deserialized_hf.get_table();
for column in 0..4 {
assert_eq!(t1[column].to_vec(), t2[column].to_vec());
}
let random_keys: [u32; 100] = array_init::array_init(|_| rand::random());
for key in random_keys.iter() {
assert_eq!(hf.hash(*key), deserialized_hf.hash(*key));
}
}
}
#[test]
fn twisted64_serialization() {
for _ in 0..1000 {
let hf = Tab64Twisted::new();
let serialized_hf = bincode::serialize(&hf).unwrap();
let deserialized_hf: Tab64Twisted = bincode::deserialize(&serialized_hf).unwrap();
let t1 = hf.get_table();
let t2 = deserialized_hf.get_table();
for column in 0..4 {
assert_eq!(t1[column].to_vec(), t2[column].to_vec());
}
let random_keys: [u64; 100] = array_init::array_init(|_| rand::random());
for key in random_keys.iter() {
assert_eq!(hf.hash(*key), deserialized_hf.hash(*key));
}
}
}