typedef enum {
MEMCACHED_BEHAVIOR_NO_BLOCK,
MEMCACHED_BEHAVIOR_TCP_NODELAY,
- MEMCACHED_BEHAVIOR_MD5_HASHING,
- MEMCACHED_BEHAVIOR_CRC_HASHING,
+ MEMCACHED_BEHAVIOR_HASH,
MEMCACHED_BEHAVIOR_KETAMA,
MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE,
MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE,
} memcached_behavior;
+typedef enum {
+ MEMCACHED_HASH_DEFAULT= 0,
+ MEMCACHED_HASH_MD5,
+ MEMCACHED_HASH_CRC,
+} memcached_hash;
+
typedef enum {
MEMCACHED_CONNECTION_UNKNOWN,
MEMCACHED_CONNECTION_TCP,
unsigned long long flags;
int send_size;
int recv_size;
+ memcached_hash hash;
memcached_return warning; /* Future Use */
};
case MEMCACHED_BEHAVIOR_TCP_NODELAY:
set_behavior_flag(ptr, MEM_TCP_NODELAY, data);
break;
- case MEMCACHED_BEHAVIOR_MD5_HASHING:
- set_behavior_flag(ptr, MEM_USE_MD5, data);
- break;
- case MEMCACHED_BEHAVIOR_CRC_HASHING:
- set_behavior_flag(ptr, MEM_USE_CRC, data);
+ case MEMCACHED_BEHAVIOR_HASH:
+ ptr->hash= *(memcached_hash *)(data);
break;
case MEMCACHED_BEHAVIOR_KETAMA:
set_behavior_flag(ptr, MEM_USE_KETAMA, data);
case MEMCACHED_BEHAVIOR_TCP_NODELAY:
temp_flag= MEM_TCP_NODELAY;
break;
- case MEMCACHED_BEHAVIOR_MD5_HASHING:
- temp_flag= MEM_USE_MD5;
- break;
- case MEMCACHED_BEHAVIOR_CRC_HASHING:
- temp_flag= MEM_USE_CRC;
- break;
+ case MEMCACHED_BEHAVIOR_HASH:
+ return ptr->hash;
case MEMCACHED_BEHAVIOR_KETAMA:
temp_flag= MEM_USE_KETAMA;
break;
#include "common.h"
+/* Defines */
+static uint64_t FNV_64_INIT= 0xcbf29ce484222325L;
+static uint64_t FNV_64_PRIME= 0x100000001b3L;
+
+static uint32_t FNV_32_INIT= 2166136261L;
+static uint32_t FNV_32_PRIME= 16777619;
+
/* Prototypes */
static unsigned int internal_generate_hash(char *key, size_t key_length);
static uint32_t internal_generate_md5(char *key, size_t key_length);
+static uint32_t internal_generate_md5(char *key, size_t key_length);
unsigned int memcached_generate_hash(memcached_st *ptr, char *key, size_t key_length)
{
uint32_t hash;
- if (ptr->flags & MEM_USE_MD5)
+ switch (ptr->hash)
+ {
+ case MEMCACHED_HASH_DEFAULT:
+ hash= internal_generate_hash(key, key_length);
+ break;
+ case MEMCACHED_HASH_MD5:
hash= internal_generate_md5(key, key_length);
- else if (ptr->flags & MEM_USE_CRC)
+ break;
+ case MEMCACHED_HASH_CRC:
hash= hash_crc32(key, key_length);
- else
- hash= internal_generate_hash(key, key_length);
+ break;
+ }
if (ptr->flags & MEM_USE_KETAMA)
{
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY);
assert(value == 1);
- memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_MD5_HASHING, &set);
- value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_MD5_HASHING);
- assert(value == 1);
+ set= MEMCACHED_HASH_MD5;
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &set);
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
+ assert(value == MEMCACHED_HASH_MD5);
set= 0;
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_TCP_NODELAY);
assert(value == 0);
- memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_MD5_HASHING, &set);
- value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_MD5_HASHING);
- assert(value == 0);
+ set= MEMCACHED_HASH_DEFAULT;
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &set);
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
+ assert(value == MEMCACHED_HASH_DEFAULT);
+
+ set= MEMCACHED_HASH_CRC;
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &set);
+ value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_HASH);
+ assert(value == MEMCACHED_HASH_CRC);
value= memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE);
assert(value > 0);
memcached_return pre_md5(memcached_st *memc)
{
- memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_MD5_HASHING, NULL);
+ memcached_hash value= MEMCACHED_HASH_MD5;
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &value);
return MEMCACHED_SUCCESS;
}
memcached_return pre_crc(memcached_st *memc)
{
- memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_CRC_HASHING, NULL);
+ memcached_hash value= MEMCACHED_HASH_CRC;
+ memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, &value);
return MEMCACHED_SUCCESS;
}