rework murmurhash2() to avoid potential unaligned memory access pointed out by naddy@ ok millert@
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
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);