Updated for help commands (and a little bit on ketama)
[awesomized/libmemcached] / lib / memcached_hash.c
1 #include "common.h"
2
3 /* Prototypes */
4 static unsigned int internal_generate_hash(char *key, size_t key_length);
5
6 unsigned int memcached_generate_hash(memcached_st *ptr, char *key, size_t key_length)
7 {
8 unsigned int return_value;
9
10 if (ptr->flags & MEM_USE_MD5)
11 {
12 unsigned char results[16];
13
14 md5_signature((unsigned char*)key, (unsigned int)key_length, results);
15
16 return_value= (unsigned int)(( results[3] << 24 )
17 | ( results[2] << 16 )
18 | ( results[1] << 8 )
19 | results[0] );
20 }
21 else
22 return_value= internal_generate_hash(key, key_length);
23
24 if (ptr->flags & MEM_USE_KETAMA)
25 {
26 assert(0);
27 return 0;
28 }
29 else
30 return return_value % ptr->number_of_hosts;
31 }
32
33 static unsigned int internal_generate_hash(char *key, size_t key_length)
34 {
35 char *ptr= key;
36 unsigned int value= 0;
37
38 while (--key_length)
39 {
40 value += *ptr++;
41 value += (value << 10);
42 value ^= (value >> 6);
43 }
44 value += (value << 3);
45 value ^= (value >> 11);
46 value += (value << 15);
47
48 return value == 0 ? 1 : value;
49 }