mirror of
https://github.com/MariaDB/server.git
synced 2025-01-22 23:04:20 +01:00
1954d2ca8f
Merge all of ticket 567 into trunk git-svn-id: file:///svn/tokudb@3134 c7de825b-a66e-492c-adef-691d508d4ae1
37 lines
1.3 KiB
C
37 lines
1.3 KiB
C
#ident "Copyright (c) 2007, 2008 Tokutek Inc. All rights reserved."
|
|
|
|
// FNV Hash: From an idea sent by Glenn Fowler and Phong Vo to the IEEE POSIX 1003.2 committee. Landon Curt Noll improved it.
|
|
// See: http://isthe.com/chongo/tech/comp/fnv/
|
|
static inline u_int32_t hash_key_extend(u_int32_t initial_hash,
|
|
const unsigned char *key,
|
|
size_t keylen) {
|
|
size_t i;
|
|
u_int32_t hash = initial_hash;
|
|
for (i=0; i<keylen; i++, key++) {
|
|
hash *= 16777619;
|
|
// GCC 4.1.2 -O2 and -O3 translates the following shifts back into the multiply shown on the line above here.
|
|
// So much for optimizing this multiplication...
|
|
//hash += (hash<<1) + (hash<<4) + (hash<<7) + (hash<<8) + (hash<<24);
|
|
hash ^= *key;
|
|
}
|
|
return hash;
|
|
}
|
|
|
|
static inline u_int32_t hash_key(const unsigned char *key, size_t keylen) {
|
|
return hash_key_extend(0, key, keylen);
|
|
}
|
|
|
|
#if 0
|
|
static unsigned int hash_key (const char *key, ITEMLEN keylen) {
|
|
/* From Sedgewick. There are probably better hash functions. */
|
|
unsigned int b = 378551;
|
|
unsigned int a = 63689;
|
|
unsigned int hash = 0;
|
|
ITEMLEN i;
|
|
for (i = 0; i < keylen; i++ ) {
|
|
hash = hash * a + key[i];
|
|
a *= b;
|
|
}
|
|
return hash;
|
|
}
|
|
#endif
|