aboutsummaryrefslogtreecommitdiffstats
path: root/include/hashfuncs.h
diff options
context:
space:
mode:
authorDouglas B. Rumbaugh <doug@douglasrumbaugh.com>2025-11-01 13:31:38 -0400
committerDouglas B. Rumbaugh <doug@douglasrumbaugh.com>2025-11-01 13:31:38 -0400
commit6338ac827b15787a0d83136eac9d681588f07f9a (patch)
treef808100cd52e54c632b31b8a42f3bdb703f3d31a /include/hashfuncs.h
downloadlibmap-6338ac827b15787a0d83136eac9d681588f07f9a.tar.gz
Initial commit
Diffstat (limited to 'include/hashfuncs.h')
-rwxr-xr-xinclude/hashfuncs.h33
1 files changed, 33 insertions, 0 deletions
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 <stdlib.h>
+
+/*
+ *
+ * 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;
+}
+