// Block read - if your platform needs to do endian-swapping or can only
// handle aligned reads, do the conversion here
+#include <cassert>
#include <cstring>
template <typename T>
static inline T getblock(const T *blocks, int i) {
for(i = -nblocks; i; i++)
{
uint32_t k1 = getblock(blocks,i);
+#if WORDS_BIGENDIAN
+ k1 = BYTESWAP_32(k1);
+#endif
k1 *= c1;
k1 = ROTL32(k1,15);
k1 *= c2;
-
+
h1 ^= k1;
- h1 = ROTL32(h1,13);
+ h1 = ROTL32(h1,13);
h1 = h1*5+0xe6546b64;
}
const uint8_t * tail = (const uint8_t*)(data + nblocks*4);
uint32_t k1 = 0;
+ memcpy(&k1, tail, len & 3);
+#if WORDS_BIGENDIAN
+ k1 = BYTESWAP_32(k1);
+#endif
- switch(len & 3)
- {
- case 3: k1 ^= tail[2] << 16;
- /* fall through */
- case 2: k1 ^= tail[1] << 8;
- /* fall through */
- case 1: k1 ^= tail[0];
- k1 *= c1; k1 = ROTL32(k1,15); k1 *= c2; h1 ^= k1;
- };
+ k1 *= c1;
+ k1 = ROTL32(k1,15);
+ k1 *= c2;
+ h1 ^= k1;
//----------
// finalization
h1 = fmix32(h1);
*(uint32_t*)out = h1;
-}
+}
//-----------------------------------------------------------------------------
uint32_t h3 = seed;
uint32_t h4 = seed;
- uint32_t c1 = 0x239b961b;
+ uint32_t c1 = 0x239b961b;
uint32_t c2 = 0xab0e9789;
- uint32_t c3 = 0x38b34ae5;
+ uint32_t c3 = 0x38b34ae5;
uint32_t c4 = 0xa1e38b93;
//----------