Adding support for CRC Hashing
[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 static uint32_t internal_generate_md5(char *key, size_t key_length);
6
7 unsigned int memcached_generate_hash(memcached_st *ptr, char *key, size_t key_length)
8 {
9 uint32_t hash;
10
11 if (ptr->flags & MEM_USE_MD5)
12 hash= internal_generate_md5(key, key_length);
13 else if (ptr->flags & MEM_USE_CRC)
14 hash= hash_crc32(key, key_length);
15 else
16 hash= internal_generate_hash(key, key_length);
17
18 if (ptr->flags & MEM_USE_KETAMA)
19 {
20 WATCHPOINT_ASSERT(0);
21 return 0;
22 }
23 else
24 return hash % ptr->number_of_hosts;
25 }
26
27 static uint32_t 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 }
44
45 static uint32_t internal_generate_md5(char *key, size_t key_length)
46 {
47 unsigned char results[16];
48
49 md5_signature((unsigned char*)key, (unsigned int)key_length, results);
50
51 return (uint32_t)(( results[3] << 24 )
52 | ( results[2] << 16 )
53 | ( results[1] << 8 )
54 | results[0] );
55 }