ref: 855889f281575f1984197f35fadc9b59d124d525
parent: 63c830bd20bb3fe0aa5252ae341496f9e15067c7
	author: cinap_lenrek <cinap_lenrek@felloff.net>
	date: Tue Aug 12 04:27:48 EDT 2025
	
git/*: make murmurhash portable We can't just cast void* to u32int* and dereference it, as this causes alignment faults on arm32 (and mips). so do byte-loads and shift/or instead.
--- a/sys/src/cmd/git/util.c
+++ b/sys/src/cmd/git/util.c
@@ -452,24 +452,13 @@
u32int m = 0x5bd1e995;
u32int r = 24;
u32int h, k;
- u32int *w, *e;
- uchar *p;
+ uchar *w, *e;
h = Seed ^ n;
e = pp;
- e += (n / 4);
-	for (w = pp; w != e; w++) {- /*
- * NB: this is endian dependent.
- * This is fine for use in git, since the
- * hashes computed here are only ever used
- * for in memory data structures.
- *
- * Pack files will differ when packed on
- * machines with different endianness,
- * but the results will still be correct.
- */
- k = *w;
+ e += n & -4;
+	for (w = pp; w != e; w += 4) {+ k = (u32int)w[0] | (u32int)w[1] << 8 | (u32int)w[2] << 16 | (u32int)w[3] << 24;
k *= m;
k ^= k >> r;
k *= m;
@@ -478,11 +467,10 @@
h ^= k;
}
- p = (uchar*)w;
 	switch (n & 0x3) {- case 3: h ^= p[2] << 16;
- case 2: h ^= p[1] << 8;
- case 1: h ^= p[0] << 0;
+ case 3: h ^= w[2] << 16;
+ case 2: h ^= w[1] << 8;
+ case 1: h ^= w[0] << 0;
h *= m;
}
--
⑨