X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fmemcached_hash.c;h=29c8d04850a2d7d3d2b8e69a83153ebd62bce116;hb=99ba76f7596ab5b861e68034ae3007cccf73a5d2;hp=fb8bd63dd8c253a848abd589667d4da5eab2db89;hpb=a9b22f8a1c9f98eef8becdbef11d8e20d43dd23c;p=awesomized%2Flibmemcached diff --git a/libmemcached/memcached_hash.c b/libmemcached/memcached_hash.c index fb8bd63d..29c8d048 100644 --- a/libmemcached/memcached_hash.c +++ b/libmemcached/memcached_hash.c @@ -84,6 +84,11 @@ uint32_t generate_hash_value(const char *key, size_t key_length, memcached_hash hash= murmur_hash(key, key_length); break; } + case MEMCACHED_HASH_JENKINS: + { + hash=jenkins_hash(key, key_length, 13); + break; + } } return hash; } @@ -116,37 +121,25 @@ static uint32_t dispatch_host(memcached_st *ptr, uint32_t hash) hash= hash; memcached_continuum_item_st *begin, *end, *left, *right, *middle; begin= left= ptr->continuum; - end= right= ptr->continuum + (num - 1); + end= right= ptr->continuum + num; - while (1) + while (left < right) { - memcached_continuum_item_st *rmiddle; - - middle = left + (right - left) / 2; - - if (middle==end) - return begin->index; - - if (middle==begin) - return end->index; - - rmiddle = middle+1; - - if (hashvalue && hash>=middle->value) - return middle->index; - + middle= left + (right - left) / 2; if (middle->value < hash) - left = middle + 1; - else if (middle->value > hash) - right = middle - 1; - - if (left>right) - return left->index; + left= middle + 1; + else + right= middle; } + if (right == end) + right= begin; + return right->index; } break; case MEMCACHED_DISTRIBUTION_MODULA: return hash % ptr->number_of_hosts; + case MEMCACHED_DISTRIBUTION_RANDOM: + return random() % ptr->number_of_hosts; default: WATCHPOINT_ASSERT(0); /* We have added a distribution without extending the logic */ return hash % ptr->number_of_hosts; @@ -169,7 +162,19 @@ uint32_t memcached_generate_hash(memcached_st *ptr, const char *key, size_t key_ if (ptr->number_of_hosts == 1) return 0; - hash= generate_hash(ptr, key, key_length); + if (ptr->flags & MEM_HASH_WITH_PREFIX_KEY) + { + int temp_len= ptr->prefix_key_length + key_length; + char *temp= (char *)malloc(temp_len); + strncpy(temp, ptr->prefix_key, ptr->prefix_key_length); + strncpy(temp + ptr->prefix_key_length, key, key_length); + hash= generate_hash(ptr, temp, temp_len); + free(temp); + } + else + { + hash= generate_hash(ptr, key, key_length); + } WATCHPOINT_ASSERT(hash);