From: Ryan Lortie Date: Wed, 17 Nov 2010 17:19:54 +0000 (-0500) Subject: g_str_hash: switch to using DJB hash X-Git-Tag: 2.27.4~42 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=354d655ba8a54b754cb5a3efb42767327775696c;p=platform%2Fupstream%2Fglib.git g_str_hash: switch to using DJB hash 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 --- diff --git a/glib/gstring.c b/glib/gstring.c index 946206f..b151135 100644 --- a/glib/gstring.c +++ b/glib/gstring.c @@ -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: hash = hash * 33 + c. 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; }