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]; size_t nblocks; const uint64_t* blocks; const uint64_t* end; size_t size_remainder; #if WORDS_BIGENDIAN unsigned i; #endif h9 = util_read64(seed + 0); h10 = util_read64(seed + 8); h0 = h3 = h6 = h9; h1 = h4 = h7 = h10; h2 = h5 = h8 = h11 = sc_const; nblocks = size / sc_blockSize; blocks = data; end = blocks + nblocks * sc_numVars; /* body */ while (blocks < end) { #if WORDS_BIGENDIAN for (i = 0; i < sc_numVars; ++i) buf[i] = util_swap64(blocks[i]); Mix(buf, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); #else Mix(blocks, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); #endif blocks += sc_numVars; } /* tail */ size_remainder = (size - ((const uint8_t*)end - (const uint8_t*)data)); memcpy(buf, end, size_remainder); memset(((uint8_t*)buf) + size_remainder, 0, sc_blockSize - size_remainder); ((uint8_t*)buf)[sc_blockSize - 1] = size_remainder; /* finalization */ #if WORDS_BIGENDIAN for (i = 0; i < sc_numVars; ++i) buf[i] = util_swap64(buf[i]); #endif End(buf, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); util_write64(digest + 0, h0); util_write64(digest + 8, h1); }
void SpookyHash128(const void* message, size_t length, 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 remainder; #if WORDS_BIGENDIAN unsigned i; #endif h9 = ((const uint64_t*)seed)[0]; h10 = ((const uint64_t*)seed)[1]; #if WORDS_BIGENDIAN h9 = util_swap64(h9); h10 = util_swap64(h10); #endif h0 = h3 = h6 = h9; h1 = h4 = h7 = h10; h2 = h5 = h8 = h11 = sc_const; u.p8 = message; end = u.p64 + (length / sc_blockSize) * sc_numVars; /* body */ while (u.p64 < end) { #if WORDS_BIGENDIAN for (i = 0; i < sc_numVars; ++i) buf[i] = util_swap64(u.p64[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); #endif u.p64 += sc_numVars; } /* tail */ remainder = (length - ((const uint8_t*)end - (const uint8_t*)message)); memcpy(buf, end, remainder); memset(((uint8_t*)buf) + remainder, 0, sc_blockSize - remainder); ((uint8_t*)buf)[sc_blockSize - 1] = remainder; /* finalization */ #if WORDS_BIGENDIAN for (i = 0; i < sc_numVars; ++i) buf[i] = util_swap64(buf[i]); #endif End(buf, h0, h1, h2, h3, h4, h5, h6, h7, h8, h9, h10, h11); #if WORDS_BIGENDIAN h0 = util_swap64(h0); h1 = util_swap64(h1); #endif ((uint64_t*)digest)[0] = h0; ((uint64_t*)digest)[1] = h1; }