diff --git a/gwlib/octstr.c b/gwlib/octstr.c
index f1f8afd..6f6800d 100644
--- a/gwlib/octstr.c
+++ b/gwlib/octstr.c
@@ -2461,18 +2461,24 @@ void octstr_format_append(Octstr *os, const char *fmt, ...)
 }
 
 
+/*
+ * Hash implementation ala Robert Sedgewick.
+ */
 unsigned long octstr_hash_key(Octstr *ostr)
 {
-    unsigned long key = 0;
-    long i;
+    unsigned long b    = 378551;
+    unsigned long a    = 63689;
+    unsigned long hash = 0;
+    unsigned long i    = 0;
+    unsigned long len = octstr_len(ostr);
+    const char *str = octstr_get_cstr(ostr);
 
-    if (ostr == NULL)
-	return 0;
-
-    for (i = 0; i < octstr_len(ostr); i++)
-	key = key + octstr_get_char(ostr, i);
+    for(i = 0; i < len; str++, i++) {
+        hash = hash*a+(*str);
+        a = a*b;
+    }
 
-    return key;
+    return (hash & 0x7FFFFFFF);
 }
 
 
