Beispiel #1
0
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);
}
Beispiel #2
0
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;
}