[glib] g_str_hash: switch to using DJB hash
- From: Ryan Lortie <ryanl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib] g_str_hash: switch to using DJB hash
- Date: Wed, 17 Nov 2010 17:30:43 +0000 (UTC)
commit 354d655ba8a54b754cb5a3efb42767327775696c
Author: Ryan Lortie <desrt desrt ca>
Date: Wed Nov 17 12:19:54 2010 -0500
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
glib/gstring.c | 18 ++++++++++++------
1 files changed, 12 insertions(+), 6 deletions(-)
---
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: <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;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]