summaryrefslogtreecommitdiff
path: root/src/lib/hash.c
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2026-06-21 12:38:06 +0200
committerSander Vrijders <sander@ouroboros.rocks>2026-06-29 08:32:59 +0200
commitb46359c11b879d610997eb1e9069e943e19c4244 (patch)
tree1a10bcb91f97416c785d1d29e0c47ab99a52eb82 /src/lib/hash.c
parentfdb50b8256f1038d5bc4f906b41605cacc769bf4 (diff)
downloadouroboros-b46359c11b879d610997eb1e9069e943e19c4244.tar.gz
ouroboros-b46359c11b879d610997eb1e9069e943e19c4244.zip
lib: Add MurmurHash3 hash_mix64 for hash tables
Adds a (non-cryptographic) MurmurHash3 fmix64 finalizer for hashing an integer key to a table index, replacing the MD5-based bucket hashing in the pft. Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks> Signed-off-by: Sander Vrijders <sander@ouroboros.rocks>
Diffstat (limited to 'src/lib/hash.c')
-rw-r--r--src/lib/hash.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/lib/hash.c b/src/lib/hash.c
index 9b26a552..903474df 100644
--- a/src/lib/hash.c
+++ b/src/lib/hash.c
@@ -74,8 +74,10 @@ uint16_t hash_len(enum hash_algo algo)
{
if (algo == HASH_CRC8)
return CRC8_HASH_LEN;
+
if (algo == HASH_CRC16)
return CRC16_HASH_LEN;
+
if (algo == HASH_CRC64)
return CRC64_HASH_LEN;
#ifdef HAVE_LIBGCRYPT
@@ -164,3 +166,14 @@ void str_hash(enum hash_algo algo,
{
return mem_hash(algo, dst, (const uint8_t *) str, strlen(str));
}
+
+uint64_t hash_mix64(uint64_t key)
+{
+ key ^= key >> 33;
+ key *= 0xff51afd7ed558ccdULL;
+ key ^= key >> 33;
+ key *= 0xc4ceb9fe1a85ec53ULL;
+ key ^= key >> 33;
+
+ return key;
+}