use core::hash::Hasher; use mur3::*; use mur3_c::*; use quickcheck_macros::quickcheck; const DATA: &[(u32, u32, u64, u64, &str)] = &[ (0x00, 0x00000000, 0x0000000000000000, 0x0000000000000000, ""), ( 0x00, 0x248bfa47, 0xcbd8a7b341bd9b02, 0x5b1e906a48ae1d19, "hello", ), ( 0x00, 0x149bbb7f, 0x342fac623a5ebc8e, 0x4cdcbc079642414d, "hello, world", ), ( 0x00, 0xe31e8a70, 0xb89e5988b737affc, 0x664fc2950231b2cb, "19 Jan 2038 at 3:14:07 AM", ), ( 0x00, 0xd5c48bfc, 0xcd99481f9ee902c9, 0x695da1a38987b6e7, "The quick brown fox jumps over the lazy dog.", ), (0x01, 0x514e28b7, 0x4610abe56eff5cb5, 0x51622daa78f83583, ""), ( 0x01, 0xbb4abcad, 0xa78ddff5adae8d10, 0x128900ef20900135, "hello", ), ( 0x01, 0x6f5cb2e9, 0x8b95f808840725c6, 0x1597ed5422bd493b, "hello, world", ), ( 0x01, 0xf50e1f30, 0x2a929de9c8f97b2f, 0x56a41d99af43a2db, "19 Jan 2038 at 3:14:07 AM", ), ( 0x01, 0x846f6a36, 0xfb3325171f9744da, 0xaaf8b92a5f722952, "The quick brown fox jumps over the lazy dog.", ), (0x2a, 0x087fcd5c, 0xf02aa77dfa1b8523, 0xd1016610da11cbb9, ""), ( 0x2a, 0xe2dbd2e1, 0xc4b8b3c960af6f08, 0x2334b875b0efbc7a, "hello", ), ( 0x2a, 0x7ec7c6c2, 0xb91864d797caa956, 0xd5d139a55afe6150, "hello, world", ), ( 0x2a, 0x58f745f6, 0xfd8f19ebdc8c6b6a, 0xd30fdc310fa08ff9, "19 Jan 2038 at 3:14:07 AM", ), ( 0x2a, 0xc02d1434, 0x74f33c659cda5af7, 0x4ec7a891caf316f0, "The quick brown fox jumps over the lazy dog.", ), ]; #[test] fn test_strings() { for (seed, h32, h64_1, h64_2, s) in DATA { let (h1, h2) = murmurhash3_x64_128(s.as_bytes(), *seed); assert_eq!((h1, h2), (*h64_1, *h64_2), "key: {}, seed: {:0x}", s, seed); let mut hasher = Hasher128::with_seed(*seed); hasher.write(s.as_bytes()); assert_eq!( hasher.finish128(), (*h64_1, *h64_2), "key: {}, seed: {:0x}", s, seed ); assert_eq!(hasher.finish(), *h64_1, "key: {}, seed: {:0x}", s, seed); let h = murmurhash3_x86_32(s.as_bytes(), *seed); assert_eq!(h, *h32, "key: {}, seed: {:0x}", s, seed); let mut hasher = Hasher32::with_seed(*seed); hasher.write(s.as_bytes()); assert_eq!( hasher.finish(), *h32 as u64, "key: {}, seed: {:0x}", s, seed ); } } #[quickcheck] fn random_check_32(xs: Vec) -> bool { let func_res = murmurhash3_x86_32(&xs, 0); let mut hasher32 = Hasher32::with_seed(0); hasher32.write(&xs); let hash_res = hasher32.finish32(); let c_res = hash32(&xs, 0); func_res == hash_res && hash_res == c_res } #[quickcheck] fn random_check_128(xs: Vec) -> bool { let func_res = murmurhash3_x64_128(&xs, 0); let mut hasher = Hasher128::with_seed(0); hasher.write(&xs); let hash_res = hasher.finish128(); let c_res = hash128_64(&xs, 0); func_res == hash_res && hash_res == c_res } #[quickcheck] fn random_check_32_seed(xs: Vec, seed: u32) -> bool { let func_res = murmurhash3_x86_32(&xs, seed); let mut hasher32 = Hasher32::with_seed(seed); hasher32.write(&xs); let hash_res = hasher32.finish32(); let c_res = hash32(&xs, seed); func_res == hash_res && hash_res == c_res } #[quickcheck] fn random_check_128_seed(xs: Vec, seed: u32) -> bool { let func_res = murmurhash3_x64_128(&xs, seed); let mut hasher = Hasher128::with_seed(seed); hasher.write(&xs); let hash_res = hasher.finish128(); let c_res = hash128_64(&xs, seed); func_res == hash_res && hash_res == c_res } #[quickcheck] fn random_check_32_chunks(xs: Vec>, seed: u32) -> bool { let mut all_bytes = vec![]; for c in &xs { all_bytes.extend_from_slice(c); } let func_res = murmurhash3_x86_32(&all_bytes, seed); let mut hasher32 = Hasher32::with_seed(seed); for x in xs { hasher32.write(&x); } let hash_res = hasher32.finish32(); let c_res = hash32(&all_bytes, seed); func_res == hash_res && hash_res == c_res } #[quickcheck] fn random_check_128_chunks(xs: Vec>, seed: u32) -> bool { let mut all_bytes = vec![]; for c in &xs { all_bytes.extend_from_slice(c); } let func_res = murmurhash3_x64_128(&all_bytes, seed); let mut hasher = Hasher128::with_seed(seed); for x in xs { hasher.write(&x); } let hash_res = hasher.finish128(); let c_res = hash128_64(&all_bytes, seed); func_res == hash_res && hash_res == c_res }