Overriding the hash algorithm used by the Berkeley DB bits isn't support 
(it would break getpw* if nothing else) and hasn't been possible since the 
symbol hiding effort last fall.  So eliminate the redirection through a 
variable and declare it as a hidden function to eliminate the relocations 
for it.

Ok?


Philip Guenther


Index: hidden/db.h
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/hidden/db.h,v
retrieving revision 1.3
diff -u -p -r1.3 db.h
--- hidden/db.h 17 Oct 2015 21:48:42 -0000      1.3
+++ hidden/db.h 20 May 2016 09:03:13 -0000
@@ -73,6 +73,9 @@ DB    *__bt_open(const char *, int, int, co
 DB     *__hash_open(const char *, int, int, const HASHINFO *, int);
 DB     *__rec_open(const char *, int, int, const RECNOINFO *, int);
 void   __dbpanic(DB *dbp);
+
+/* Default hash function, from db/hash/hash_func.c */
+u_int32_t      __default_hash(const void *, size_t);
 __END_HIDDEN_DECLS
 
 PROTO_NORMAL(dbopen);
Index: stdlib/hcreate.c
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/stdlib/hcreate.c,v
retrieving revision 1.6
diff -u -p -r1.6 hcreate.c
--- stdlib/hcreate.c    10 Sep 2015 18:13:46 -0000      1.6
+++ stdlib/hcreate.c    20 May 2016 09:03:55 -0000
@@ -55,6 +55,8 @@
 #include <string.h>
 #include <sys/queue.h>
 
+#include <db.h>                /* for __default_hash */
+
 #ifndef _DIAGASSERT
 #define _DIAGASSERT(x)
 #endif
@@ -79,9 +81,6 @@ SLIST_HEAD(internal_head, internal_entry
 #define        MAX_BUCKETS_LG2 (sizeof (size_t) * 8 - 1 - 5)
 #define        MAX_BUCKETS     ((size_t)1 << MAX_BUCKETS_LG2)
 
-/* Default hash function, from db/hash/hash_func.c */
-extern u_int32_t (*__default_hash)(const void *, size_t);
-
 static struct internal_head *htable;
 static size_t htablesize;
 
@@ -164,7 +163,7 @@ hsearch(ENTRY item, ACTION action)
        _DIAGASSERT(action == ENTER || action == FIND);
 
        len = strlen(item.key);
-       hashval = (*__default_hash)(item.key, len);
+       hashval = __default_hash(item.key, len);
 
        head = &htable[hashval & (htablesize - 1)];
        ie = SLIST_FIRST(head);
Index: db/hash/extern.h
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/db/hash/extern.h,v
retrieving revision 1.8
diff -u -p -r1.8 extern.h
--- db/hash/extern.h    27 Aug 2015 04:37:09 -0000      1.8
+++ db/hash/extern.h    20 May 2016 09:04:27 -0000
@@ -56,9 +56,6 @@ int    __put_page(HTAB *, char *, u_int32_
 void    __reclaim_buf(HTAB *, BUFHEAD *);
 int     __split_page(HTAB *, u_int32_t, u_int32_t);
 
-/* Default hash routine. */
-extern u_int32_t (*__default_hash)(const void *, size_t);
-
 #ifdef HASH_STATISTICS
 extern int hash_accesses, hash_collisions, hash_expansions, hash_overflows;
 #endif
Index: db/hash/hash_func.c
===================================================================
RCS file: /data/src/openbsd/src/lib/libc/db/hash/hash_func.c,v
retrieving revision 1.10
diff -u -p -r1.10 hash_func.c
--- db/hash/hash_func.c 5 Aug 2005 13:03:00 -0000       1.10
+++ db/hash/hash_func.c 29 May 2016 02:41:12 -0000
@@ -35,118 +35,10 @@
 #include <sys/types.h>
 
 #include <db.h>
-#include "hash.h"
-#include "page.h"
-#include "extern.h"
-
-#ifdef notdef
-static u_int32_t hash1(const void *, size_t);
-static u_int32_t hash2(const void *, size_t);
-static u_int32_t hash3(const void *, size_t);
-#endif
-static u_int32_t hash4(const void *, size_t);
-
-/* Default hash function. */
-u_int32_t (*__default_hash)(const void *, size_t) = hash4;
-
-#ifdef notdef
-/*
- * Assume that we've already split the bucket to which this key hashes,
- * calculate that bucket, and check that in fact we did already split it.
- *
- * EJB's original hsearch hash.
- */
-#define PRIME1         37
-#define PRIME2         1048583
-
-u_int32_t
-hash1(const void *key, size_t len)
-{
-       u_int32_t h;
-       u_int8_t *k;
-
-       h = 0;
-       k = (u_int8_t *)key;
-       /* Convert string to integer */
-       while (len--)
-               h = h * PRIME1 ^ (*k++ - ' ');
-       h %= PRIME2;
-       return (h);
-}
-
-/*
- * Phong Vo's linear congruential hash
- */
-#define dcharhash(h, c)        ((h) = 0x63c63cd9*(h) + 0x9c39c33d + (c))
-
-u_int32_t
-hash2(const void *key, size_t len)
-{
-       u_int32_t h;
-       u_int8_t *e, c, *k;
-
-       k = (u_int8_t *)key;
-       e = k + len;
-       for (h = 0; k != e;) {
-               c = *k++;
-               if (!c && k > e)
-                       break;
-               dcharhash(h, c);
-       }
-       return (h);
-}
-
-/*
- * This is INCREDIBLY ugly, but fast.  We break the string up into 8 byte
- * units.  On the first time through the loop we get the "leftover bytes"
- * (strlen % 8).  On every other iteration, we perform 8 HASHC's so we handle
- * all 8 bytes.  Essentially, this saves us 7 cmp & branch instructions.  If
- * this routine is heavily used enough, it's worth the ugly coding.
- *
- * Ozan Yigit's original sdbm hash.
- */
-u_int32_t
-hash3(const void *key, size_t len)
-{
-       u_int32_t n, loop;
-       u_int8_t *k;
-
-#define HASHC   n = *k++ + 65599 * n
-
-       n = 0;
-       k = (u_int8_t *)key;
-       if (len > 0) {
-               loop = (len + 8 - 1) >> 3;
-
-               switch (len & (8 - 1)) {
-               case 0:
-                       do {    /* All fall throughs */
-                               HASHC;
-               case 7:
-                               HASHC;
-               case 6:
-                               HASHC;
-               case 5:
-                               HASHC;
-               case 4:
-                               HASHC;
-               case 3:
-                               HASHC;
-               case 2:
-                               HASHC;
-               case 1:
-                               HASHC;
-                       } while (--loop);
-               }
-
-       }
-       return (n);
-}
-#endif /* notdef */
 
 /* Chris Torek's hash function. */
 u_int32_t
-hash4(const void *key, size_t len)
+__default_hash(const void *key, size_t len)
 {
        u_int32_t h, loop;
        u_int8_t *k;

Reply via email to