Disable hsieh algorithm by default
authorEric Lambert <eric.lambert@sun.com>
Fri, 1 May 2009 02:31:48 +0000 (19:31 -0700)
committerEric Lambert <eric.lambert@sun.com>
Fri, 1 May 2009 02:31:48 +0000 (19:31 -0700)
Per a conversation with Brian earlier this week, there are some licensing
issues with the hsieh hashing algorithm that make it 'desirable' for support
of this algorithm to be a compile time option. This patch turns off support
for hsieh by default but allows it to be used when '--enable-hsieh_hash' is
passed into configure.

config/hsieh.m4 [new file with mode: 0644]
configure.ac
docs/memcached_behavior.pod
libmemcached/Makefile.am
libmemcached/common.h
libmemcached/memcached_behavior.c
libmemcached/memcached_hash.c
tests/function.c

diff --git a/config/hsieh.m4 b/config/hsieh.m4
new file mode 100644 (file)
index 0000000..f958f46
--- /dev/null
@@ -0,0 +1,22 @@
+dnl ---------------------------------------------------------------------------
+dnl Macro: HSIEH_HASH
+dnl ---------------------------------------------------------------------------
+AC_ARG_ENABLE(hsieh_hash,
+    [  --enable-hsieh_hash     build with support for hsieh hashing.],
+    [
+      if test "x$enableval" != "xno"; then
+          ENABLE_HSIEH="true"
+          AC_DEFINE([HAVE_HSIEH_HASH], [1], [Enables hsieh hashing support])
+      else
+          ENABLE_HSIEH="false"
+      fi
+    ],
+    [
+      ENABLE_HSIEH="false"
+    ]
+)
+
+AM_CONDITIONAL([INCLUDE_HSIEH_SRC], [test "x$ENABLE_HSIEH" = "xtrue"])
+dnl ---------------------------------------------------------------------------
+dnl End Macro: HSIEH_HASH
+dnl ---------------------------------------------------------------------------
index 14699f9eb65a2a01413147df25c35443fb430305..52f6f53f778086705db266233a6c5fde851a8d3e 100644 (file)
@@ -64,6 +64,7 @@ sinclude(config/64bit.m4)
 sinclude(config/protocol_binary.m4)
 sinclude(config/memcached.m4)
 sinclude(config/setsockopt.m4)
+sinclude(config/hsieh.m4)
 
 # We only support GCC and Sun's forte at the moment
 if test "$GCC" = "yes"
index ccccfde220620380c37fb1b9e26a80b3c9018e15..2799dcce0ab2b0fc1ffd74121977d380f2c8d436 100755 (executable)
@@ -84,6 +84,7 @@ environments).
 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, 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.
+Support for MEMCACHED_HASH_HSIEH is a compile time option that is disabled by default. To enable support for this hashing algorithm, configure and build libmemcached with the --enable-hash_hsieh. 
 
 =item MEMCACHED_BEHAVIOR_DISTRIBUTION
 
index 84d00d62a1f4261fcd38e220be77af9c8f7391a3..19a6015279e11e39b319cf4d12c43afb8035ac45 100644 (file)
@@ -29,7 +29,6 @@ pkginclude_HEADERS= memcached.h \
 lib_LTLIBRARIES = libmemcached.la
 
 libmemcached_la_SOURCES = crc.c \
-                         hsieh_hash.c \
                          memcached.c \
                          memcached_auto.c \
                          memcached_analyze.c \
@@ -62,6 +61,10 @@ libmemcached_la_SOURCES = crc.c \
                          murmur_hash.c \
                          jenkins_hash.c
 
+if INCLUDE_HSIEH_SRC
+libmemcached_la_SOURCES += hsieh_hash.c
+endif
+
 if BUILD_BYTEORDER
 libmemcached_la_SOURCES += byteorder.c
 endif
index 7abeefd773be66b696d942dee281a8faf7de4a3f..b9560966a5762e82a9e98cdbfd0644640b782b9d 100644 (file)
@@ -84,7 +84,9 @@ typedef enum {
 void md5_signature(const unsigned char *key, unsigned int length, unsigned char *result);
 uint32_t hash_crc32(const char *data,
                     size_t data_len);
+#ifdef HAVE_HSIEH_HASH
 uint32_t hsieh_hash(const char *key, size_t key_length);
+#endif
 uint32_t murmur_hash(const char *key, size_t key_length);
 uint32_t jenkins_hash(const void *key, size_t length, uint32_t initval);
 
index eb28a37362caad19fe3defece57e616eb301dbe1..6bc00064da3155e69ca7aaf2ff4f0078e239e9ba 100644 (file)
@@ -100,6 +100,10 @@ memcached_return memcached_behavior_set(memcached_st *ptr,
       break;
     }
   case MEMCACHED_BEHAVIOR_HASH:
+#ifndef HAVE_HSIEH_HASH
+    if ((memcached_hash)(data) == MEMCACHED_HASH_HSIEH)
+      return MEMCACHED_FAILURE;
+#endif
     ptr->hash= (memcached_hash)(data);
     break;
   case MEMCACHED_BEHAVIOR_KETAMA_HASH:
index c7bcb4bed35810cbad3ebbfb22475ddd8f0260ab..d2af51653be0e815511addc738d15f51aab22cf5 100644 (file)
@@ -74,11 +74,13 @@ uint32_t memcached_generate_hash_value(const char *key, size_t key_length, memca
       }
     }
     break;
+#ifdef HAVE_HSIEH_HASH
     case MEMCACHED_HASH_HSIEH:
     {
       hash= hsieh_hash(key, key_length);
       break;
     }
+#endif
     case MEMCACHED_HASH_MURMUR:
     {
       hash= murmur_hash(key, key_length);
index d4239a80c09c43bb54997eef074e2ff0287995a2..1f0c404b5e0a760a6fa7489c01a396398a734db5 100644 (file)
@@ -2856,9 +2856,12 @@ static memcached_return  pre_crc(memcached_st *memc)
 
 static memcached_return  pre_hsieh(memcached_st *memc)
 {
+#ifdef HAVE_HSIEH_HASH
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH, (uint64_t)MEMCACHED_HASH_HSIEH);
-
   return MEMCACHED_SUCCESS;
+#else
+  return MEMCACHED_FAILURE;
+#endif
 }
 
 static memcached_return  pre_hash_fnv1_64(memcached_st *memc)
@@ -3069,7 +3072,8 @@ static memcached_return  enable_consistent(memcached_st *memc)
   memcached_server_distribution value= MEMCACHED_DISTRIBUTION_CONSISTENT;
   memcached_hash hash;
   memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION, value);
-  pre_hsieh(memc);
+  if (pre_hsieh(memc) != MEMCACHED_SUCCESS)
+    return MEMCACHED_FAILURE;
 
   value= (memcached_server_distribution)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_DISTRIBUTION);
   assert(value == MEMCACHED_DISTRIBUTION_CONSISTENT);
@@ -3624,6 +3628,18 @@ test_return udp_mixed_io_test(memcached_st *memc)
   return TEST_SUCCESS;
 }
 
+test_return hsieh_avaibility_test (memcached_st *memc)
+{
+  memcached_return expected_rc= MEMCACHED_FAILURE;
+#ifdef HAVE_HSIEH_HASH
+  expected_rc= MEMCACHED_SUCCESS;
+#endif
+  memcached_return rc= memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_HASH,
+                                            (uint64_t)MEMCACHED_HASH_HSIEH);
+  assert(rc == expected_rc);
+  return TEST_SUCCESS;
+}
+
 test_st udp_setup_server_tests[] ={
   {"set_udp_behavior_test", 0, set_udp_behavior_test},
   {"add_tcp_server_udp_client_test", 0, add_tcp_server_udp_client_test},
@@ -3795,7 +3811,13 @@ test_st consistent_weighted_tests[] ={
   {0, 0, 0}
 };
 
+test_st hsieh_availability[] ={
+  {"hsieh_avaibility_test",0,hsieh_avaibility_test},
+  {0, 0, 0}
+};
+
 collection_st collection[] ={
+  {"hsieh_availability",0,0,hsieh_availability},
   {"udp_setup", init_udp, 0, udp_setup_server_tests},
   {"udp_io", init_udp, 0, upd_io_tests},
   {"udp_binary_io", binary_init_udp, 0, upd_io_tests},