summaryrefslogtreecommitdiff
path: root/deps/jemalloc.orig/include/jemalloc/internal/hash.h
blob: 8a46ce30803aef2518bccbed0c0151182af7a066 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/******************************************************************************/
#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

#if (defined(JEMALLOC_ENABLE_INLINE) || defined(JEMALLOC_HASH_C_))
/*
 * 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 = 0xc6a4a7935bd1e995LLU;
	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);
	const unsigned char *data2;

	assert(((uintptr_t)key & 0x7) == 0);

	while(data != end) {
		uint64_t k = *data++;

		k *= m;
		k ^= k >> r;
		k *= m;

		h ^= k;
		h *= m;
	}

	data2 = (const unsigned char *)data;
	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;

	return (h);
}
#endif

#endif /* JEMALLOC_H_INLINES */
/******************************************************************************/