diff --git a/cmdline/murmur3.c b/cmdline/murmur3.c index 23d2b1f5..41a19432 100644 --- a/cmdline/murmur3.c +++ b/cmdline/murmur3.c @@ -75,12 +75,12 @@ uint32_t c2 = 0xab0e9789; uint32_t c3 = 0x38b34ae5; uint32_t c4 = 0xa1e38b93; -void MurmurHash3_x86_128(const void* key, unsigned len, const uint8_t* seed, void* out) +void MurmurHash3_x86_128(const void* data, size_t size, const uint8_t* seed, void* digest) { - const uint8_t* data = key; - unsigned nblocks = len / 16; - unsigned i; + size_t nblocks; const uint32_t* blocks; + const uint32_t* end; + size_t remainder; uint32_t h1 = ((const uint32_t*)seed)[0]; uint32_t h2 = ((const uint32_t*)seed)[1]; @@ -94,11 +94,12 @@ void MurmurHash3_x86_128(const void* key, unsigned len, const uint8_t* seed, voi h4 = util_swap32(h4); #endif - blocks = (const uint32_t*)data; + nblocks = size / 16; + blocks = data; + end = blocks + nblocks * 4; /* body */ - - for (i = 0; i < nblocks; ++i) { + while (blocks < end) { uint32_t k1 = blocks[0]; uint32_t k2 = blocks[1]; uint32_t k3 = blocks[2]; @@ -131,7 +132,8 @@ void MurmurHash3_x86_128(const void* key, unsigned len, const uint8_t* seed, voi } /* tail */ - { + remainder = size & 15; + if (remainder != 0) { const uint8_t* tail = (const uint8_t*)blocks; uint32_t k1 = 0; @@ -139,7 +141,7 @@ void MurmurHash3_x86_128(const void* key, unsigned len, const uint8_t* seed, voi uint32_t k3 = 0; uint32_t k4 = 0; - switch (len & 15) { + switch (remainder) { case 15 : k4 ^= tail[14] << 16; case 14 : k4 ^= tail[13] << 8; case 13 : k4 ^= tail[12] << 0; @@ -163,8 +165,7 @@ void MurmurHash3_x86_128(const void* key, unsigned len, const uint8_t* seed, voi } /* finalization */ - - h1 ^= len; h2 ^= len; h3 ^= len; h4 ^= len; + h1 ^= size; h2 ^= size; h3 ^= size; h4 ^= size; h1 += h2; h1 += h3; h1 += h4; h2 += h1; h3 += h1; h4 += h1; @@ -184,9 +185,9 @@ void MurmurHash3_x86_128(const void* key, unsigned len, const uint8_t* seed, voi h4 = util_swap32(h4); #endif - ((uint32_t*)out)[0] = h1; - ((uint32_t*)out)[1] = h2; - ((uint32_t*)out)[2] = h3; - ((uint32_t*)out)[3] = h4; + ((uint32_t*)digest)[0] = h1; + ((uint32_t*)digest)[1] = h2; + ((uint32_t*)digest)[2] = h3; + ((uint32_t*)digest)[3] = h4; } diff --git a/cmdline/spooky2.c b/cmdline/spooky2.c index 169d974e..8d2a0334 100644 --- a/cmdline/spooky2.c +++ b/cmdline/spooky2.c @@ -108,17 +108,13 @@ // #define sc_const 0xdeadbeefdeadbeefLL -void SpookyHash128(const void* message, size_t length, const uint8_t* seed, uint8_t* digest) +void SpookyHash128(const void* data, size_t size, const uint8_t* seed, uint8_t* digest) { uint64_t h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11; uint64_t buf[sc_numVars]; - uint64_t* end; - - union { - const uint8_t* p8; - uint64_t* p64; - size_t i; - } u; + size_t nblocks; + const uint64_t* blocks; + const uint64_t* end; size_t remainder; #if WORDS_BIGENDIAN unsigned i; @@ -136,25 +132,24 @@ void SpookyHash128(const void* message, size_t length, const uint8_t* seed, uint h1 = h4 = h7 = h10; h2 = h5 = h8 = h11 = sc_const; - u.p8 = message; - end = u.p64 + (length / sc_blockSize) * sc_numVars; + nblocks = size / sc_blockSize; + blocks = data; + end = blocks + nblocks * sc_numVars; /* body */ - - while (u.p64 < end) { + while (blocks < end) { #if WORDS_BIGENDIAN for (i = 0; i < sc_numVars; ++i) - buf[i] = util_swap64(u.p64[i]); + buf[i] = util_swap64(blocks[i]); Mix(buf, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); #else - Mix(u.p64, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); + Mix(blocks, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); #endif - u.p64 += sc_numVars; + blocks += sc_numVars; } /* tail */ - - remainder = (length - ((const uint8_t*)end - (const uint8_t*)message)); + remainder = (size - ((const uint8_t*)end - (const uint8_t*)data)); memcpy(buf, end, remainder); memset(((uint8_t*)buf) + remainder, 0, sc_blockSize - remainder); ((uint8_t*)buf)[sc_blockSize - 1] = remainder;