Merging in Brian Pontz work on Jenkins hash
author <brian@gir-3.local> <>
Mon, 22 Sep 2008 23:16:51 +0000 (02:16 +0300)
committer <brian@gir-3.local> <>
Mon, 22 Sep 2008 23:16:51 +0000 (02:16 +0300)
ChangeLog
docs/memcached_behavior.pod
libmemcached/Makefile.am
libmemcached/common.h
libmemcached/memcached_constants.h
libmemcached/memcached_hash.c
tests/function.c

index 16e53cb1d593b868a14a01ce2bc9dccc8899306e..ecb91f72754dd8c9b02c7df34f873dcef6fb9b27 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,7 @@
-0.24 Tue Sep 16 02:59:03 PDT 2008
+0.25
+  * Jenkins HASH added.
+
+0.24 Tue Sep 16 02:59:03 PDT 2008 (never released)
   * Cleanup compile warnings.
   * Fix issues in partitioning by keys.
   * Fixed "fail case" to make sure when calling memcached_clone() no
index 68714fb4a956b17369eed0e2bc607d8bb332fdfa..51e09e71436236ddede4ece9abc6b09b02cdd0d4 100755 (executable)
@@ -64,7 +64,8 @@ environments).
 =item MEMCACHED_BEHAVIOR_HASH
 
 Makes the default hashing algorithm for keys use MD5. The value can be set
-to either MEMCACHED_HASH_DEFAULT, MEMCACHED_HASH_MD5, MEMCACHED_HASH_CRC, MEMCACHED_HASH_FNV1_64, MEMCACHED_HASH_FNV1A_64, MEMCACHED_HASH_FNV1_32, and MEMCACHED_HASH_FNV1A_32. The behavior for all hashes but MEMCACHED_HASH_DEFAULT is identitical to the Java driver written by Dustin Sallings.
+to either MEMCACHED_HASH_DEFAULT, MEMCACHED_HASH_MD5, MEMCACHED_HASH_CRC, MEMCACHED_HASH_FNV1_64, MEMCACHED_HASH_FNV1A_64, MEMCACHED_HASH_FNV1_32, MEMCACHED_HASH_FNV1A_32, MEMCACHED_HASH_JENKINS, MEMCACHED_HASH_HSIEH, and MEMCACHED_HASH_MURMUR. 
+Each hash has it's advantages and it's weaknesses. If you dont know or dont care, just go with the default.
 
 =item MEMCACHED_BEHAVIOR_DISTRIBUTION
 
index fbb7726a7aa6dea0a3836ac73930df923ed40498..595a3c89486ad0f185ddc086f3a65196a3858c44 100644 (file)
@@ -69,6 +69,7 @@ libmemcached_la_SOURCES = crc.c \
                          memcached_verbosity.c \
                          memcached_version.c \
                          murmur_hash.c \
+                         jenkins_hash.c \
                           byteorder.c
 
 libmemcached_la_LIBADD =
index ff60c232225c54296e0527e0f0b36fc80433ccf5..24d4cce82a7e96d6b5a6c91b67ac4457a32a05b3 100644 (file)
@@ -90,6 +90,7 @@ uint32_t hash_crc32(const char *data,
                     size_t data_len);
 uint32_t hsieh_hash(const char *key, size_t key_length);
 uint32_t murmur_hash(const char *key, size_t key_length);
+uint32_t jenkins_hash(const void *key, size_t length, uint32_t initval);
 
 memcached_return memcached_connect(memcached_server_st *ptr);
 memcached_return memcached_response(memcached_server_st *ptr,
index ab64042142865a5034d8f5d51cb8d035070750be..47774d37e641adab8138ea5eac3716fd5ea6a626 100644 (file)
@@ -115,7 +115,8 @@ typedef enum {
   MEMCACHED_HASH_FNV1_32,
   MEMCACHED_HASH_FNV1A_32,
   MEMCACHED_HASH_HSIEH,
-  MEMCACHED_HASH_MURMUR
+  MEMCACHED_HASH_MURMUR,
+  MEMCACHED_HASH_JENKINS
 } memcached_hash;
 
 typedef enum {
index fb8bd63dd8c253a848abd589667d4da5eab2db89..901f2c486c8d5645e7f5dc229d986ee1f572357f 100644 (file)
@@ -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;
 }
index 599a88688bf0ce0ccd6c28b6ccd76c1ca73bdd88..4483232c6b6666a24e80af0d8f577ea70453d32c 100644 (file)
@@ -2526,6 +2526,14 @@ static memcached_return  pre_murmur(memcached_st *memc)
   return MEMCACHED_SUCCESS;
 }
 
+static memcached_return pre_jenkins(memcached_st *memc)
+{
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_JENKINS);
+
+  return MEMCACHED_SUCCESS;
+}
+
+
 static memcached_return  pre_md5(memcached_st *memc)
 {
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_MD5);
@@ -2980,6 +2988,7 @@ collection_st collection[] ={
   {"md5", pre_md5, 0, tests},
   {"crc", pre_crc, 0, tests},
   {"hsieh", pre_hsieh, 0, tests},
+  {"jenkins", pre_jenkins, 0, tests},
   {"fnv1_64", pre_hash_fnv1_64, 0, tests},
   {"fnv1a_64", pre_hash_fnv1a_64, 0, tests},
   {"fnv1_32", pre_hash_fnv1_32, 0, tests},
@@ -3003,6 +3012,7 @@ collection_st collection[] ={
   {"generate_hsieh_consistent", enable_consistent, 0, generate_tests},
   {"generate_md5", pre_md5, 0, generate_tests},
   {"generate_murmur", pre_murmur, 0, generate_tests},
+  {"generate_jenkins", pre_jenkins, 0, generate_tests},
   {"generate_nonblock", pre_nonblock, 0, generate_tests},
   {"consistent_not", 0, 0, consistent_tests},
   {"consistent_ketama", pre_behavior_ketama, 0, consistent_tests},