// vim:fileencoding=utf-8:foldmethod=marker #include "test_hasher.h" #include "MurmurHash3.h" #include "siphash.h" #include "wapp.h" WpTestFuncResult test_murmur3(void) { b8 result = true; WpStr8 str = wpStr8Lit("Hello world"); WpI32Array arr = wpArray(i32, 1, 2, 3, 4, 5); u64 num = 287324; WpMur3HasherData data = wpMur3HasherData(873923); WpU8Stream str_bytes = wpStream(u8, str.buf, str.size); WpU8Stream arr_bytes = wpStream(u8, (u8 *)arr, wpArrayCount(arr) * wpArrayItemSize(arr)); WpU8Stream num_bytes = wpStream(u8, (u8 *)&num, sizeof(u64)); u64 hash[2] = {0}; // Sring hash WpU128Hash mur_hash = wpX64Mur3Hasher128(&str_bytes, (void *)&data); MurmurHash3_x64_128(str_bytes.data, str_bytes.count * str_bytes.item_size, data.seed, (void *)hash); result = result && mur_hash.hash[0] == hash[0] && mur_hash.hash[1] == hash[1]; // Array hash mur_hash = wpX64Mur3Hasher128(&arr_bytes, (void *)&data); MurmurHash3_x64_128(arr_bytes.data, arr_bytes.count * arr_bytes.item_size, data.seed, (void *)hash); result = result && mur_hash.hash[0] == hash[0] && mur_hash.hash[1] == hash[1]; // Number hash mur_hash = wpX64Mur3Hasher128(&num_bytes, (void *)&data); MurmurHash3_x64_128(num_bytes.data, num_bytes.count * num_bytes.item_size, data.seed, (void *)hash); result = result && mur_hash.hash[0] == hash[0] && mur_hash.hash[1] == hash[1]; return wpTesterResult(result); } WpTestFuncResult test_siphash_128(void) { b8 result = true; WpStr8 str = wpStr8Lit("Hello world"); WpI32Array arr = wpArray(i32, 1, 2, 3, 4, 5); u64 num = 287324; WpSipHasherKey key = { 238742, 671734 }; WpSipHasherData data = wpSip24HasherData(key); WpU8Stream str_bytes = wpStream(u8, str.buf, str.size); WpU8Stream arr_bytes = wpStream(u8, (u8 *)arr, wpArrayCount(arr) * wpArrayItemSize(arr)); WpU8Stream num_bytes = wpStream(u8, (u8 *)&num, sizeof(u64)); u64 hash[2] = {0}; // Sring hash WpU128Hash sip_hash = wpSipHasher128(&str_bytes, (void *)&data); siphash(str_bytes.data, str_bytes.count * str_bytes.item_size, (void *)&data.key, (u8 *)hash, sizeof(u64) * 2); result = result && sip_hash.hash[0] == hash[0] && sip_hash.hash[1] == hash[1]; // Array hash sip_hash = wpSipHasher128(&arr_bytes, (void *)&data); siphash(arr_bytes.data, arr_bytes.count * arr_bytes.item_size, (void *)&data.key, (u8 *)hash, sizeof(u64) * 2); result = result && sip_hash.hash[0] == hash[0] && sip_hash.hash[1] == hash[1]; // Number hash sip_hash = wpSipHasher128(&num_bytes, (void *)&data); siphash(num_bytes.data, num_bytes.count * num_bytes.item_size, (void *)&data.key, (u8 *)hash, sizeof(u64) * 2); result = result && sip_hash.hash[0] == hash[0] && sip_hash.hash[1] == hash[1]; return wpTesterResult(result); } WpTestFuncResult test_siphash_64(void) { b8 result = true; WpStr8 str = wpStr8Lit("Hello world"); WpI32Array arr = wpArray(i32, 1, 2, 3, 4, 5); u64 num = 287324; WpSipHasherKey key = { 238742, 671734 }; WpSipHasherData data = wpSip24HasherData(key); WpU8Stream str_bytes = wpStream(u8, str.buf, str.size); WpU8Stream arr_bytes = wpStream(u8, (u8 *)arr, wpArrayCount(arr) * wpArrayItemSize(arr)); WpU8Stream num_bytes = wpStream(u8, (u8 *)&num, sizeof(u64)); u64 hash = {0}; // Sring hash u64 sip_hash = wpSipHasher64(&str_bytes, (void *)&data); siphash(str_bytes.data, str_bytes.count * str_bytes.item_size, (void *)&data.key, (u8 *)&hash, sizeof(u64)); result = result && sip_hash == hash; // Array hash sip_hash = wpSipHasher64(&arr_bytes, (void *)&data); siphash(arr_bytes.data, arr_bytes.count * arr_bytes.item_size, (void *)&data.key, (u8 *)&hash, sizeof(u64)); result = result && sip_hash == hash; // Number hash sip_hash = wpSipHasher64(&num_bytes, (void *)&data); siphash(num_bytes.data, num_bytes.count * num_bytes.item_size, (void *)&data.key, (u8 *)&hash, sizeof(u64)); result = result && sip_hash == hash; return wpTesterResult(result); }