Created
October 5, 2013 03:40
-
-
Save csthompson/6836415 to your computer and use it in GitHub Desktop.
Hashing
This file contains hidden or 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
unsigned long | |
hash(unsigned char *str) | |
{ | |
unsigned long hash = 5381; | |
int c; | |
while (c = *str++) | |
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ | |
return hash; | |
} |
This file contains hidden or 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
unsigned hash(const char* s) | |
{ | |
unsigned h = SALT; | |
while (*s) | |
h = h * 101 + (unsigned char*) *s++; | |
return h; | |
} |
This file contains hidden or 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
Hash Lowercase Random UUID Numbers | |
============= ============= =========== ============== | |
Murmur 145 ns 259 ns 92 ns | |
6 collis 5 collis 0 collis | |
FNV-1a 152 ns 504 ns 86 ns | |
4 collis 4 collis 0 collis | |
FNV-1 184 ns 730 ns 92 ns | |
1 collis 5 collis 0 collis* | |
DBJ2a 158 ns 443 ns 91 ns | |
5 collis 6 collis 0 collis*** | |
DJB2 156 ns 437 ns 93 ns | |
7 collis 6 collis 0 collis*** | |
SDBM 148 ns 484 ns 90 ns | |
4 collis 6 collis 0 collis** | |
SuperFastHash 164 ns 344 ns 118 ns | |
85 collis 4 collis 18742 collis | |
CRC32 250 ns 946 ns 130 ns | |
2 collis 0 collis 0 collis | |
LoseLose 338 ns - - | |
215178 collis |
This file contains hidden or 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
//----------------------------------------------------------------------------- | |
// MurmurHash2, by Austin Appleby | |
// Note - This code makes a few assumptions about how your machine behaves - | |
// 1. We can read a 4-byte value from any address without crashing | |
// 2. sizeof(int) == 4 | |
// And it has a few limitations - | |
// 1. It will not work incrementally. | |
// 2. It will not produce the same results on little-endian and big-endian | |
// machines. | |
unsigned int MurmurHash2 ( const void * key, int len, unsigned int seed ) | |
{ | |
// 'm' and 'r' are mixing constants generated offline. | |
// They're not really 'magic', they just happen to work well. | |
const unsigned int m = 0x5bd1e995; | |
const int r = 24; | |
// Initialize the hash to a 'random' value | |
unsigned int h = seed ^ len; | |
// Mix 4 bytes at a time into the hash | |
const unsigned char * data = (const unsigned char *)key; | |
while(len >= 4) | |
{ | |
unsigned int k = *(unsigned int *)data; | |
k *= m; | |
k ^= k >> r; | |
k *= m; | |
h *= m; | |
h ^= k; | |
data += 4; | |
len -= 4; | |
} | |
// Handle the last few bytes of the input array | |
switch(len) | |
{ | |
case 3: h ^= data[2] << 16; | |
case 2: h ^= data[1] << 8; | |
case 1: h ^= data[0]; | |
h *= m; | |
}; | |
// Do a few final mixes of the hash to ensure the last few | |
// bytes are well-incorporated. | |
h ^= h >> 13; | |
h *= m; | |
h ^= h >> 15; | |
return h; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment