Cleanup of hash functions

This commit is contained in:
Andrea Mazzoleni 2015-05-10 17:17:42 +02:00
parent 41a3692430
commit 8efa1ddfca
2 changed files with 28 additions and 32 deletions

View file

@ -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;
}

View file

@ -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;