0d83cb75a7d0b0591b9ae4f2cbb8c0ccbd960862
4 static uint64_t FNV_64_INIT
= 0xcbf29ce484222325L
;
5 static uint64_t FNV_64_PRIME
= 0x100000001b3L
;
7 static uint32_t FNV_32_INIT
= 2166136261L;
8 static uint32_t FNV_32_PRIME
= 16777619;
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 static uint32_t internal_generate_ketama_md5(char *key
, size_t key_length
);
16 unsigned int memcached_generate_hash(memcached_st
*ptr
, char *key
, size_t key_length
)
23 case MEMCACHED_HASH_DEFAULT
:
24 hash
= internal_generate_hash(key
, key_length
);
26 case MEMCACHED_HASH_MD5
:
27 hash
= internal_generate_md5(key
, key_length
);
29 case MEMCACHED_HASH_CRC
:
30 hash
= ((hash_crc32(key
, key_length
) >> 16) & 0x7fff);
32 /* FNV hash'es lifted from Dustin Sallings work */
33 case MEMCACHED_HASH_FNV1_64
:
35 /* Thanks to pierre@demartines.com for the pointer */
37 for (x
= 0; x
< key_length
; x
++)
44 case MEMCACHED_HASH_FNV1A_64
:
47 for (x
= 0; x
< key_length
; x
++)
54 case MEMCACHED_HASH_FNV1_32
:
57 for (x
= 0; x
< key_length
; x
++)
64 case MEMCACHED_HASH_FNV1A_32
:
67 for (x
= 0; x
< key_length
; x
++)
74 case MEMCACHED_HASH_KETAMA
:
76 hash
= internal_generate_ketama_md5(key
, key_length
);
81 WATCHPOINT_ASSERT(hash
);
82 if (ptr
->flags
& MEM_USE_KETAMA
)
88 return hash
% ptr
->number_of_hosts
;
91 static uint32_t internal_generate_hash(char *key
, size_t key_length
)
94 unsigned int value
= 0;
99 value
+= (value
<< 10);
100 value
^= (value
>> 6);
102 value
+= (value
<< 3);
103 value
^= (value
>> 11);
104 value
+= (value
<< 15);
106 return value
== 0 ? 1 : value
;
109 static uint32_t internal_generate_md5(char *key
, size_t key_length
)
111 unsigned char results
[16];
113 md5_signature((unsigned char*)key
, (unsigned int)key_length
, results
);
115 return (uint32_t)(( results
[3] << 24 )
116 | ( results
[2] << 16 )
117 | ( results
[1] << 8 )
121 static uint32_t internal_generate_ketama_md5(char *key
, size_t key_length
)
123 unsigned char results
[16];
125 md5_signature((unsigned char*)key
, (unsigned int)key_length
, results
);
127 return ((uint32_t) (results
[3] & 0xFF) << 24)
128 | ((uint32_t) (results
[2] & 0xFF) << 16)
129 | ((uint32_t) (results
[1] & 0xFF) << 8)
130 | (results
[0] & 0xFF);