|
@@ -100,10 +100,18 @@ uint64_t siphash24(const void *src, unsigned long src_sz, const struct sipkey *k
|
|
|
uint64_t k0 = key->k0;
|
|
|
uint64_t k1 = key->k1;
|
|
|
uint64_t b = (uint64_t)src_sz << 56;
|
|
|
+#ifdef UNALIGNED_OK
|
|
|
const uint64_t *in = (uint64_t*)src;
|
|
|
+#else
|
|
|
+ /* On platforms where alignment matters, if 'in' is a pointer to a
|
|
|
+ * datatype that must be aligned, the compiler is allowed to
|
|
|
+ * generate code that assumes that it is aligned as such.
|
|
|
+ */
|
|
|
+ const uint8_t *in = (uint8_t *)src;
|
|
|
+#endif
|
|
|
|
|
|
- uint64_t t;
|
|
|
- uint8_t *pt, *m;
|
|
|
+ uint64_t t;
|
|
|
+ uint8_t *pt, *m;
|
|
|
|
|
|
uint64_t v0 = k0 ^ 0x736f6d6570736575ULL;
|
|
|
uint64_t v1 = k1 ^ 0x646f72616e646f6dULL;
|
|
@@ -113,12 +121,14 @@ uint64_t siphash24(const void *src, unsigned long src_sz, const struct sipkey *k
|
|
|
while (src_sz >= 8) {
|
|
|
#ifdef UNALIGNED_OK
|
|
|
uint64_t mi = _le64toh(*in);
|
|
|
+ in += 1;
|
|
|
#else
|
|
|
uint64_t mi;
|
|
|
memcpy(&mi, in, 8);
|
|
|
mi = _le64toh(mi);
|
|
|
+ in += 8;
|
|
|
#endif
|
|
|
- in += 1; src_sz -= 8;
|
|
|
+ src_sz -= 8;
|
|
|
v3 ^= mi;
|
|
|
DOUBLE_ROUND(v0,v1,v2,v3);
|
|
|
v0 ^= mi;
|