Commit 5df018ff07ef1aef0762d98cceb95fa04dbdb706

Stefan Sperling 2021-10-14T16:03:22

rework murmurhash2() to avoid potential unaligned memory access pointed out by naddy@ ok millert@

diff --git a/lib/murmurhash2.c b/lib/murmurhash2.c
index ac869f8..d3a6754 100644
--- a/lib/murmurhash2.c
+++ b/lib/murmurhash2.c
@@ -5,11 +5,12 @@
 /* Obtained from https://github.com/aappleby/smhasher */
 
 #include <stdint.h>
+#include <string.h>
 
 #include "murmurhash2.h"
 
 uint32_t
-murmurhash2(const void * key, int len, uint32_t seed)
+murmurhash2(const unsigned char * key, int len, uint32_t seed)
 {
   // 'm' and 'r' are mixing constants generated offline.
   // They're not really 'magic', they just happen to work well.
@@ -23,11 +24,13 @@ murmurhash2(const void * key, int len, uint32_t seed)
 
   // Mix 4 bytes at a time into the hash
 
-  const unsigned char *data = (const unsigned char *)key;
+  const unsigned char *data = key;
 
   while(len >= 4)
   {
-    uint32_t k = *(uint32_t*)data;
+    uint32_t k;
+
+    memcpy(&k, data, sizeof(k));
 
     k *= m;
     k ^= k >> r;
@@ -58,4 +61,4 @@ murmurhash2(const void * key, int len, uint32_t seed)
   h ^= h >> 15;
 
   return h;
-} 
+}
diff --git a/lib/murmurhash2.h b/lib/murmurhash2.h
index bbd2bf3..8fa42cd 100644
--- a/lib/murmurhash2.h
+++ b/lib/murmurhash2.h
@@ -4,4 +4,4 @@
 
 /* Obtained from https://github.com/aappleby/smhasher */
 
-uint32_t murmurhash2(const void *key, int len, uint32_t seed);
+uint32_t murmurhash2(const unsigned char *key, int len, uint32_t seed);