Last active
April 13, 2017 14:06
-
-
Save cybertxt/b5ab912f1c165c7b673e9b3233c9539c to your computer and use it in GitHub Desktop.
time31/bob hash methos
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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