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;
> 

Reply via email to