04319189a69b7d9c94e5be72a0e8d1cbb45a8027
[awesomized/libmemcached] / lib / memcached_hash.c
1 #include "common.h"
2
3 /* Defines */
4 static uint64_t FNV_64_INIT= 0xcbf29ce484222325L;
5 static uint64_t FNV_64_PRIME= 0x100000001b3L;
6
7 static uint32_t FNV_32_INIT= 2166136261L;
8 static uint32_t FNV_32_PRIME= 16777619;
9
10 /* Prototypes */
11 static unsigned int internal_generate_hash(char *key, size_t key_length);
12 static uint32_t internal_generate_md5(char *key, size_t key_length);
13 static uint32_t internal_generate_md5(char *key, size_t key_length);
14
15 unsigned int memcached_generate_hash(memcached_st *ptr, char *key, size_t key_length)
16 {
17 uint32_t hash;
18
19 switch (ptr->hash)
20 {
21 case MEMCACHED_HASH_DEFAULT:
22 hash= internal_generate_hash(key, key_length);
23 break;
24 case MEMCACHED_HASH_MD5:
25 hash= internal_generate_md5(key, key_length);
26 break;
27 case MEMCACHED_HASH_CRC:
28 hash= hash_crc32(key, key_length);
29 break;
30 }
31
32 if (ptr->flags & MEM_USE_KETAMA)
33 {
34 WATCHPOINT_ASSERT(0);
35 return 0;
36 }
37 else
38 return hash % ptr->number_of_hosts;
39 }
40
41 static uint32_t internal_generate_hash(char *key, size_t key_length)
42 {
43 char *ptr= key;
44 unsigned int value= 0;
45
46 while (--key_length)
47 {
48 value += *ptr++;
49 value += (value << 10);
50 value ^= (value >> 6);
51 }
52 value += (value << 3);
53 value ^= (value >> 11);
54 value += (value << 15);
55
56 return value == 0 ? 1 : value;
57 }
58
59 static uint32_t internal_generate_md5(char *key, size_t key_length)
60 {
61 unsigned char results[16];
62
63 md5_signature((unsigned char*)key, (unsigned int)key_length, results);
64
65 return (uint32_t)(( results[3] << 24 )
66 | ( results[2] << 16 )
67 | ( results[1] << 8 )
68 | results[0] );
69 }