From 6338ac827b15787a0d83136eac9d681588f07f9a Mon Sep 17 00:00:00 2001 From: "Douglas B. Rumbaugh" Date: Sat, 1 Nov 2025 13:31:38 -0400 Subject: Initial commit --- include/hashfuncs.h | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100755 include/hashfuncs.h (limited to 'include/hashfuncs.h') diff --git a/include/hashfuncs.h b/include/hashfuncs.h new file mode 100755 index 0000000..da5d788 --- /dev/null +++ b/include/hashfuncs.h @@ -0,0 +1,33 @@ +#include + +/* + * + * 32 bit FNV-1a algorithm + * https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo_hash_function + * + */ +static size_t hash_key(const char *key, const size_t max_hash_value) { + uint32_t hash = 2166136261U; /* FNV-1a 32-bit offset basis */ + /* + * We'll explicitly use unsigned chars here, since we're doing arithmetic. The + * C standard doesn't state whether an implementation must use signed or + * unsigned values for characters, so this conversion ensures we get + * correct behavior. If signed characters are used, we'll get overflows + * and other odd issues in the hash calculation. + */ + const unsigned char *p = (unsigned char *) key; + + while (*p) { + hash ^= *p++; + hash *= 16777619U; /* FNV-1a prime */ + } + + return hash % max_hash_value; +} + +static size_t test_hash(const char *key, const size_t max_hash_value) { + (void) max_hash_value; + + return key[0] % 3; +} + -- cgit v1.2.3