g_str_hash: switch to using DJB hash
authorRyan Lortie <desrt@desrt.ca>
Wed, 17 Nov 2010 17:19:54 +0000 (12:19 -0500)
committerRyan Lortie <desrt@desrt.ca>
Wed, 17 Nov 2010 17:24:53 +0000 (12:24 -0500)
This is the same as what we were already doing with 2 changes:

  - use an initial value of 5381 instead of 0

  - multiply by 33 in each round instead of 31

glib/gstring.c

index 946206f..b151135 100644 (file)
@@ -121,20 +121,26 @@ g_str_equal (gconstpointer v1,
  * @v: a string key
  *
  * Converts a string to a hash value.
- * It can be passed to g_hash_table_new() as the @hash_func 
- * parameter, when using strings as keys in a #GHashTable.
+ *
+ * This function implements the widely used "djb" hash apparently posted
+ * by Daniel Bernstein to comp.lang.c some time ago.  The 32 bit
+ * unsigned hash value starts at 5381 and for each byte 'c' in the
+ * string, is updated: <literal>hash = hash * 33 + c</literal>.  This
+ * function uses the signed value of each byte.
+ *
+ * It can be passed to g_hash_table_new() as the @hash_func parameter,
+ * when using strings as keys in a #GHashTable.
  *
  * Returns: a hash value corresponding to the key
- */
+ **/
 guint
 g_str_hash (gconstpointer v)
 {
-  /* 31 bit hash function */
   const signed char *p;
-  guint32 h = 0;
+  guint32 h = 5381;
 
   for (p = v; *p != '\0'; p++)
-    h = (h << 5) - h + *p;
+    h = (h << 5) + h + *p;
 
   return h;
 }