Skip to content

Instantly share code, notes, and snippets.

@cybertxt
Last active April 13, 2017 14:06
Show Gist options
  • Save cybertxt/b5ab912f1c165c7b673e9b3233c9539c to your computer and use it in GitHub Desktop.
Save cybertxt/b5ab912f1c165c7b673e9b3233c9539c to your computer and use it in GitHub Desktop.
time31/bob hash methos
#include <stdint.h>
uint32_t time31_hash_bin(const void* data, uint32_t length)
{
uint32_t hash = 0;
const uint8_t* p = (const uint8_t*)data;
const uint8_t* pend = p + length;
for(; p < pend; ++p)
hash = (hash<<5) - hash + *p;
return hash;
}
uint32_t bob_hash_bin(const void* data, uint32_t length)
{
#define mix(a,b,c) \
a -= b; a -= c; a ^= (c >> 13);\
b -= c; b -= a; b ^= (a << 8);\
c -= a; c -= b; c ^= (b >> 13);\
a -= b; a -= c; a ^= (c >> 12);\
b -= c; b -= a; b ^= (a << 16);\
c -= a; c -= b; c ^= (b >> 5);\
a -= b; a -= c; a ^= (c >> 3);\
b -= c; b -= a; b ^= (a << 10);\
c -= a; c -= b; c ^= (b >> 15);
const uint8_t* k = (const uint8_t *)data;
uint32_t a, b, c, len;
/* Set up the internal state */
len = length;
a = b = c = 0x9e3779b9; /* the golden ratio; an arbitrary value */
/* Handle most of the key */
while (len >= 12)
{
a += (k[0] +((uint32_t)k[1] << 8) +((uint32_t)k[2] << 16) +((uint32_t)k[3] << 24));
b += (k[4] +((uint32_t)k[5] << 8) +((uint32_t)k[6] << 16) +((uint32_t)k[7] << 24));
c += (k[8] +((uint32_t)k[9] << 8) +((uint32_t)k[10]<< 16)+((uint32_t)k[11] << 24));
mix(a,b,c);
k += 12; len -= 12;
}
/* Handle the last 11 bytes */
c += length;
switch(len)/* all the case statements fall through */
{
case 11: c+=((uint32_t)k[10] << 24);
case 10: c+=((uint32_t)k[9] << 16);
case 9 : c+=((uint32_t)k[8] << 8);
/* the first byte of c is reserved for the length */
case 8 : b+=((uint32_t)k[7] << 24);
case 7 : b+=((uint32_t)k[6] << 16);
case 6 : b+=((uint32_t)k[5] << 8);
case 5 : b+=k[4];
case 4 : a+=((uint32_t)k[3] << 24);
case 3 : a+=((uint32_t)k[2] << 16);
case 2 : a+=((uint32_t)k[1] << 8);
case 1 : a+=k[0];
}
mix(a,b,c);
#undef mix
return c;
}
uint64_t time31_bob_mixed_hash_bin(const void* data, uint32_t length)
{
uint64_t time31_hash_val = time31_hash_bin(data, length);
uint64_t bob_hash_value = bob_hash_bin(data, length);
return (bob_hash_value<<32) | time31_hash_val;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment