Download raw body.
MurmurHash2 unaligned access
On Thu, Oct 14, 2021 at 12:03:57PM +0200, Christian Weisgerber wrote:
> I'm surprised this hasn't blown up on sparc64:
>
> uint32_t
> murmurhash2(const void * key, int len, uint32_t seed)
> {
> ...
> const unsigned char *data = (const unsigned char *)key;
> ...
> uint32_t k = *(uint32_t*)data;
> ...
>
The patch below eliminates the cast to uint32_t.
Our hash input (SHA1 has object ID) is an uint8_t array type.
Should we change the type of the key argument to uint8_t * or is the
cast from void * to unsigned char * safe? It seems 'data' will be
accessed in multiples of 4. I don't know sparc64 alignement
requirements off the top of my head. Is 4 or 8 required?
diff 1d19226a8a09c02a94d6ccee03f964fd413f2fe1 /home/stsp/src/got
blob - ac869f866068f2b1050c52779f2539890a8c877f
file + lib/murmurhash2.c
--- lib/murmurhash2.c
+++ lib/murmurhash2.c
@@ -5,6 +5,7 @@
/* Obtained from https://github.com/aappleby/smhasher */
#include <stdint.h>
+#include <string.h>
#include "murmurhash2.h"
@@ -27,8 +28,10 @@ murmurhash2(const void * key, int len, uint32_t seed)
while(len >= 4)
{
- uint32_t k = *(uint32_t*)data;
+ uint32_t k;
+ memcpy(&k, data, sizeof(k));
+
k *= m;
k ^= k >> r;
k *= m;
MurmurHash2 unaligned access