On Sat, May 28, 2016 at 07:47:50PM -0700, Philip Guenther wrote:
>
> 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?
Looks good to me. libc shouldn't be a dumping ground for everyone's
favorite hash function, especially if not even compiled in.
>
>
> 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;
>