2010-02-11 02:37:56 +08:00
|
|
|
/******************************************************************************/
|
|
|
|
#ifdef JEMALLOC_H_TYPES
|
|
|
|
|
|
|
|
#endif /* JEMALLOC_H_TYPES */
|
|
|
|
/******************************************************************************/
|
|
|
|
#ifdef JEMALLOC_H_STRUCTS
|
|
|
|
|
|
|
|
#endif /* JEMALLOC_H_STRUCTS */
|
|
|
|
/******************************************************************************/
|
|
|
|
#ifdef JEMALLOC_H_EXTERNS
|
|
|
|
|
|
|
|
#endif /* JEMALLOC_H_EXTERNS */
|
|
|
|
/******************************************************************************/
|
|
|
|
#ifdef JEMALLOC_H_INLINES
|
|
|
|
|
|
|
|
#ifndef JEMALLOC_ENABLE_INLINE
|
|
|
|
uint64_t hash(const void *key, size_t len, uint64_t seed);
|
|
|
|
#endif
|
|
|
|
|
2011-03-19 08:56:14 +08:00
|
|
|
#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_HASH_C_))
|
2010-02-11 02:37:56 +08:00
|
|
|
/*
|
|
|
|
* The following hash function is based on MurmurHash64A(), placed into the
|
|
|
|
* public domain by Austin Appleby. See http://murmurhash.googlepages.com/ for
|
|
|
|
* details.
|
|
|
|
*/
|
|
|
|
JEMALLOC_INLINE uint64_t
|
|
|
|
hash(const void *key, size_t len, uint64_t seed)
|
|
|
|
{
|
|
|
|
const uint64_t m = 0xc6a4a7935bd1e995;
|
|
|
|
const int r = 47;
|
|
|
|
uint64_t h = seed ^ (len * m);
|
|
|
|
const uint64_t *data = (const uint64_t *)key;
|
|
|
|
const uint64_t *end = data + (len/8);
|
2010-02-11 10:15:53 +08:00
|
|
|
const unsigned char *data2;
|
|
|
|
|
|
|
|
assert(((uintptr_t)key & 0x7) == 0);
|
2010-02-11 02:37:56 +08:00
|
|
|
|
|
|
|
while(data != end) {
|
|
|
|
uint64_t k = *data++;
|
|
|
|
|
|
|
|
k *= m;
|
|
|
|
k ^= k >> r;
|
|
|
|
k *= m;
|
|
|
|
|
|
|
|
h ^= k;
|
|
|
|
h *= m;
|
|
|
|
}
|
|
|
|
|
2010-02-11 10:15:53 +08:00
|
|
|
data2 = (const unsigned char *)data;
|
2010-02-11 02:37:56 +08:00
|
|
|
switch(len & 7) {
|
|
|
|
case 7: h ^= ((uint64_t)(data2[6])) << 48;
|
|
|
|
case 6: h ^= ((uint64_t)(data2[5])) << 40;
|
|
|
|
case 5: h ^= ((uint64_t)(data2[4])) << 32;
|
|
|
|
case 4: h ^= ((uint64_t)(data2[3])) << 24;
|
|
|
|
case 3: h ^= ((uint64_t)(data2[2])) << 16;
|
|
|
|
case 2: h ^= ((uint64_t)(data2[1])) << 8;
|
|
|
|
case 1: h ^= ((uint64_t)(data2[0]));
|
|
|
|
h *= m;
|
|
|
|
}
|
|
|
|
|
|
|
|
h ^= h >> r;
|
|
|
|
h *= m;
|
|
|
|
h ^= h >> r;
|
|
|
|
|
2011-02-14 10:44:59 +08:00
|
|
|
return (h);
|
2010-02-11 02:37:56 +08:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* JEMALLOC_H_INLINES */
|
|
|
|
/******************************************************************************/
|