Adding support for CRC Hashing
[awesomized/libmemcached] / lib / memcached_hash.c
index ca7229c2cd89880945afe49622c65e9974017f6a..073b0c5d81b606f6a9f7730dd326b448eee5c88e 100644 (file)
@@ -2,32 +2,29 @@
 
 /* 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);
 
 unsigned int memcached_generate_hash(memcached_st *ptr, char *key, size_t key_length)
 {
-  unsigned int hash;
+  uint32_t hash;
 
   if (ptr->flags & MEM_USE_MD5)
-  {
-    unsigned char results[16];
-
-    md5_signature((unsigned char*)key, (unsigned int)key_length, results);
-
-    hash= (unsigned int)(( results[3] << 24 )
-                                | ( results[2] << 16 )
-                                | ( results[1] <<  8 )
-                                |   results[0] );
-  }
+    hash= internal_generate_md5(key, key_length);
+  else if (ptr->flags & MEM_USE_CRC)
+    hash= hash_crc32(key, key_length);
   else
     hash= internal_generate_hash(key, key_length);
 
   if (ptr->flags & MEM_USE_KETAMA)
-    assert(0);
+  {
+    WATCHPOINT_ASSERT(0);
+    return 0;
+  }
   else
     return hash % ptr->number_of_hosts;
 }
 
-static unsigned int internal_generate_hash(char *key, size_t key_length)
+static uint32_t internal_generate_hash(char *key, size_t key_length)
 {
   char *ptr= key;
   unsigned int value= 0;
@@ -44,3 +41,15 @@ static unsigned int internal_generate_hash(char *key, size_t key_length)
 
   return value == 0 ? 1 : value;
 }
+
+static uint32_t internal_generate_md5(char *key, size_t key_length)
+{
+  unsigned char results[16];
+
+  md5_signature((unsigned char*)key, (unsigned int)key_length, results);
+
+  return (uint32_t)(( results[3] << 24 )
+                    | ( results[2] << 16 )
+                    | ( results[1] <<  8 )
+                    |   results[0] );
+}