Added MD5 hashing scheme. Refactored code to allow for more hashing types.
[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 return return_value % ptr->number_of_hosts;
25 }
26
27 static unsigned int internal_generate_hash(char *key, size_t key_length)
28 {
29 char *ptr= key;
30 unsigned int value= 0;
31
32 while (--key_length)
33 {
34 value += *ptr++;
35 value += (value << 10);
36 value ^= (value >> 6);
37 }
38 value += (value << 3);
39 value ^= (value >> 11);
40 value += (value << 15);
41
42 return value == 0 ? 1 : value;
43 }