]> sjero.net Git - wget/blob - src/hash.c
[svn] Get rid of ssl_iread/ssl_iwrite. Have the SSL code register its
[wget] / src / hash.c
1 /* Hash tables.
2    Copyright (C) 2000, 2001 Free Software Foundation, Inc.
3
4 This file is part of GNU Wget.
5
6 GNU Wget is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or (at
9 your option) any later version.
10
11 GNU Wget is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with Wget; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19
20 In addition, as a special exception, the Free Software Foundation
21 gives permission to link the code of its release of Wget with the
22 OpenSSL project's "OpenSSL" library (or with modified versions of it
23 that use the same license as the "OpenSSL" library), and distribute
24 the linked executables.  You must obey the GNU General Public License
25 in all respects for all of the code used other than "OpenSSL".  If you
26 modify this file, you may extend this exception to your version of the
27 file, but you are not obligated to do so.  If you do not wish to do
28 so, delete this exception statement from your version.  */
29
30 #ifdef HAVE_CONFIG_H
31 # include <config.h>
32 #endif
33
34 #ifdef HAVE_STRING_H
35 # include <string.h>
36 #else
37 # include <strings.h>
38 #endif /* HAVE_STRING_H */
39 #include <stdlib.h>
40 #include <assert.h>
41
42 #include "wget.h"
43 #include "utils.h"
44
45 #include "hash.h"
46
47 #ifdef STANDALONE
48 # undef xmalloc
49 # undef xrealloc
50 # undef xfree
51
52 # define xmalloc malloc
53 # define xrealloc realloc
54 # define xfree free
55
56 # undef TOLOWER
57 # define TOLOWER(x) ('A' <= (x) && (x) <= 'Z' ? (x) - 32 : (x))
58 #endif
59
60 /* INTERFACE:
61
62    Hash tables are an implementation technique used to implement
63    mapping between objects.  Assuming a good hashing function is used,
64    they provide near-constant-time access and storing of information.
65    Duplicate keys are not allowed.
66
67    This file defines the following entry points: hash_table_new
68    creates a hash table, and hash_table_destroy deletes it.
69    hash_table_put establishes a mapping between a key and a value.
70    hash_table_get retrieves the value that corresponds to a key.
71    hash_table_contains queries whether a key is stored in a table at
72    all.  hash_table_remove removes a mapping that corresponds to a
73    key.  hash_table_map allows you to map through all the entries in a
74    hash table.  hash_table_clear clears all the entries from the hash
75    table.
76
77    The number of mappings in a table is not limited, except by the
78    amount of memory.  As you add new elements to a table, it regrows
79    as necessary.  If you have an idea about how many elements you will
80    store, you can provide a hint to hash_table_new().
81
82    The hashing and equality functions depend on the type of key and
83    are normally provided by the user.  For the special (and frequent)
84    case of using string keys, you can use the pre-canned
85    make_string_hash_table(), which provides an efficient string
86    hashing function, and a string equality wrapper around strcmp().
87
88    When specifying your hash and test functions, make sure the
89    following holds true:
90
91    - The test function returns non-zero for keys that are considered
92      "equal", zero otherwise.
93
94    - The hash function returns a number that represents the
95      "distinctness" of the object.  In more precise terms, it means
96      that for any two objects that test "equal" under the test
97      function, the hash function MUST produce the same result.
98
99      This does not mean that each distinct object must produce a
100      distinct value, only that non-distinct objects must produce the
101      same values!  For instance, a hash function that returns 0 for
102      any given object is a perfectly valid (albeit extremely bad) hash
103      function.  A hash function that hashes a string by adding up all
104      its characters is another example of a valid (but quite bad) hash
105      function.
106
107      The above stated rule is quite easy to enforce.  For example, if
108      your testing function compares strings case-insensitively, all
109      your function needs to do is lower-case the string characters
110      before calculating a hash.  That way you have easily guaranteed
111      that case differences will not result in a different hash.
112
113    - If you care about performance, choose a hash function with as
114      good "spreading" as possible.  A good hash function will react to
115      even a small change in its input with a completely different
116      resulting hash.  Finally, don't make the hash function itself
117      overly slow, because you'll be incurring a non-negligible
118      overhead to reads and writes to the hash table.
119
120    Note that neither keys nor values are copied when inserted into the
121    hash table, so they must exist for the lifetime of the table.  This
122    means that e.g. the use of static strings is OK, but objects with a
123    shorter life-time need to be copied (with strdup() or the like in
124    the case of strings) before being inserted.  */
125
126 /* IMPLEMENTATION:
127
128    All the hash mappings (key-value pairs of pointers) are stored in a
129    contiguous array.  The position of each mapping is determined by
130    the hash value of its key and the size of the table: location :=
131    hash(key) % size.  If two different keys end up on the same
132    position (hash collision), the one that came second is placed at
133    the next empty position following the occupied place.  This
134    collision resolution technique is called "linear probing".
135
136    There are more advanced collision resolution mechanisms (quadratic
137    probing, double hashing), but we don't use them because they incur
138    more non-sequential access to the array, which results in worse
139    cache behavior.  Linear probing works well as long as the
140    fullness/size ratio is kept below 75%.  We make sure to regrow or
141    rehash the hash table whenever this threshold is exceeded.
142
143    Collisions make deletion tricky because finding collisions again
144    relies on new empty spots not being created.  That's why
145    hash_table_remove is careful to rehash the mappings that follow the
146    deleted one.  */
147
148 /* Maximum allowed fullness: when hash table's fullness exceeds this
149    value, the table is resized.  */
150 #define HASH_MAX_FULLNESS 0.75
151
152 /* The hash table size is multiplied by this factor (and then rounded
153    to the next prime) with each resize.  This guarantees infrequent
154    resizes.  */
155 #define HASH_RESIZE_FACTOR 2
156
157 struct mapping {
158   void *key;
159   void *value;
160 };
161
162 struct hash_table {
163   unsigned long (*hash_function) PARAMS ((const void *));
164   int (*test_function) PARAMS ((const void *, const void *));
165
166   int size;                     /* size of the array */
167   int count;                    /* number of non-empty, non-deleted
168                                    fields. */
169
170   int resize_threshold;         /* after size exceeds this number of
171                                    entries, resize the table.  */
172   int prime_offset;             /* the offset of the current prime in
173                                    the prime table. */
174
175   struct mapping *mappings;     /* the array of mapping pairs. */
176 };
177
178 /* We use NULL key to mark a mapping as empty.  It is consequently
179    illegal to store NULL keys.  */
180 #define NON_EMPTY(mp) (mp->key != NULL)
181
182 /* "Next" mapping is the mapping after MP, but wrapping back to
183    MAPPINGS when MP would reach MAPPINGS+SIZE.  */
184 #define NEXT_MAPPING(mp, mappings, size) (mp != mappings + (size - 1)   \
185                                           ? mp + 1 : mappings)
186
187 /* Loop over non-empty mappings starting at MP. */
188 #define LOOP_NON_EMPTY(mp, mappings, size)                              \
189   for (; NON_EMPTY (mp); mp = NEXT_MAPPING (mp, mappings, size))
190
191 /* #### We might want to multiply with the "golden ratio" here to get
192    better randomness for keys that do not result from a good hash
193    function.  This is currently not a problem in Wget because we only
194    use the string hash tables.  */
195
196 #define HASH_POSITION(ht, key) (ht->hash_function (key) % ht->size)
197
198 /* Find a prime near, but greather than or equal to SIZE.  Of course,
199    the primes are not calculated, but looked up from a table.  The
200    table does not contain all primes in range, just a selection useful
201    for this purpose.
202
203    PRIME_OFFSET is a minor optimization: if specified, it starts the
204    search for the prime number beginning with the specific offset in
205    the prime number table.  The final offset is stored in the same
206    variable.  */
207
208 static int
209 prime_size (int size, int *prime_offset)
210 {
211   static const unsigned long primes [] = {
212     13, 19, 29, 41, 59, 79, 107, 149, 197, 263, 347, 457, 599, 787, 1031,
213     1361, 1777, 2333, 3037, 3967, 5167, 6719, 8737, 11369, 14783,
214     19219, 24989, 32491, 42257, 54941, 71429, 92861, 120721, 156941,
215     204047, 265271, 344857, 448321, 582821, 757693, 985003, 1280519,
216     1664681, 2164111, 2813353, 3657361, 4754591, 6180989, 8035301,
217     10445899, 13579681, 17653589, 22949669, 29834603, 38784989,
218     50420551, 65546729, 85210757, 110774011, 144006217, 187208107,
219     243370577, 316381771, 411296309, 534685237, 695090819, 903618083,
220     1174703521, 1527114613, 1985248999,
221     (unsigned long)0x99d43ea5, (unsigned long)0xc7fa5177
222   };
223   int i = *prime_offset;
224
225   for (; i < countof (primes); i++)
226     if (primes[i] >= size)
227       {
228         /* Set the offset to the next prime.  That is safe because,
229            next time we are called, it will be with a larger SIZE,
230            which means we could never return the same prime anyway.
231            (If that is not the case, the caller can simply reset
232            *prime_offset.)  */
233         *prime_offset = i + 1;
234         return primes[i];
235       }
236
237   abort ();
238   return 0;
239 }
240
241 static unsigned long ptrhash PARAMS ((const void *));
242 static int ptrcmp PARAMS ((const void *, const void *));
243
244 /* Create a hash table with hash function HASH_FUNCTION and test
245    function TEST_FUNCTION.  The table is empty (its count is 0), but
246    pre-allocated to store at least ITEMS items.
247
248    ITEMS is the number of items that the table can accept without
249    needing to resize.  It is useful when creating a table that is to
250    be immediately filled with a known number of items.  In that case,
251    the regrows are a waste of time, and specifying ITEMS correctly
252    will avoid them altogether.
253
254    Note that hash tables grow dynamically regardless of ITEMS.  The
255    only use of ITEMS is to preallocate the table and avoid unnecessary
256    dynamic regrows.  Don't bother making ITEMS prime because it's not
257    used as size unchanged.  To start with a small table that grows as
258    needed, simply specify zero ITEMS.
259
260    If HASH_FUNCTION is not provided, identity table is assumed,
261    i.e. key pointers are compared as keys.  If you want strings with
262    equal contents to hash the same, use make_string_hash_table.  */
263
264 struct hash_table *
265 hash_table_new (int items,
266                 unsigned long (*hash_function) (const void *),
267                 int (*test_function) (const void *, const void *))
268 {
269   int size;
270   struct hash_table *ht = xnew (struct hash_table);
271
272   ht->hash_function = hash_function ? hash_function : ptrhash;
273   ht->test_function = test_function ? test_function : ptrcmp;
274
275   /* If the size of struct hash_table ever becomes a concern, this
276      field can go.  (Wget doesn't create many hashes.)  */
277   ht->prime_offset = 0;
278
279   /* Calculate the size that ensures that the table will store at
280      least ITEMS keys without the need to resize.  */
281   size = 1 + items / HASH_MAX_FULLNESS;
282   size = prime_size (size, &ht->prime_offset);
283   ht->size = size;
284   ht->resize_threshold = size * HASH_MAX_FULLNESS;
285   /*assert (ht->resize_threshold >= items);*/
286
287   ht->mappings = xnew0_array (struct mapping, ht->size);
288   ht->count = 0;
289
290   return ht;
291 }
292
293 /* Free the data associated with hash table HT. */
294
295 void
296 hash_table_destroy (struct hash_table *ht)
297 {
298   xfree (ht->mappings);
299   xfree (ht);
300 }
301
302 /* The heart of most functions in this file -- find the mapping whose
303    KEY is equal to key, using linear probing.  Returns the mapping
304    that matches KEY, or the first empty mapping if none matches.  */
305
306 static inline struct mapping *
307 find_mapping (const struct hash_table *ht, const void *key)
308 {
309   struct mapping *mappings = ht->mappings;
310   int size = ht->size;
311   struct mapping *mp = mappings + HASH_POSITION (ht, key);
312   int (*equals) PARAMS ((const void *, const void *)) = ht->test_function;
313
314   LOOP_NON_EMPTY (mp, mappings, size)
315     if (equals (key, mp->key))
316       break;
317   return mp;
318 }
319
320 /* Get the value that corresponds to the key KEY in the hash table HT.
321    If no value is found, return NULL.  Note that NULL is a legal value
322    for value; if you are storing NULLs in your hash table, you can use
323    hash_table_contains to be sure that a (possibly NULL) value exists
324    in the table.  Or, you can use hash_table_get_pair instead of this
325    function.  */
326
327 void *
328 hash_table_get (const struct hash_table *ht, const void *key)
329 {
330   struct mapping *mp = find_mapping (ht, key);
331   if (NON_EMPTY (mp))
332     return mp->value;
333   else
334     return NULL;
335 }
336
337 /* Like hash_table_get, but writes out the pointers to both key and
338    value.  Returns non-zero on success.  */
339
340 int
341 hash_table_get_pair (const struct hash_table *ht, const void *lookup_key,
342                      void *orig_key, void *value)
343 {
344   struct mapping *mp = find_mapping (ht, lookup_key);
345   if (NON_EMPTY (mp))
346     {
347       if (orig_key)
348         *(void **)orig_key = mp->key;
349       if (value)
350         *(void **)value = mp->value;
351       return 1;
352     }
353   else
354     return 0;
355 }
356
357 /* Return 1 if HT contains KEY, 0 otherwise. */
358
359 int
360 hash_table_contains (const struct hash_table *ht, const void *key)
361 {
362   struct mapping *mp = find_mapping (ht, key);
363   return NON_EMPTY (mp);
364 }
365
366 /* Grow hash table HT as necessary, and rehash all the key-value
367    mappings.  */
368
369 static void
370 grow_hash_table (struct hash_table *ht)
371 {
372   struct mapping *old_mappings = ht->mappings;
373   struct mapping *old_end      = ht->mappings + ht->size;
374   struct mapping *mp, *mappings;
375   int newsize;
376
377   newsize = prime_size (ht->size * HASH_RESIZE_FACTOR, &ht->prime_offset);
378 #if 0
379   printf ("growing from %d to %d; fullness %.2f%% to %.2f%%\n",
380           ht->size, newsize,
381           100.0 * ht->count / ht->size,
382           100.0 * ht->count / newsize);
383 #endif
384
385   ht->size = newsize;
386   ht->resize_threshold = newsize * HASH_MAX_FULLNESS;
387   ht->mappings = mappings = xnew0_array (struct mapping, ht->size);
388
389   for (mp = old_mappings; mp < old_end; mp++)
390     if (NON_EMPTY (mp))
391       {
392         struct mapping *new_mp = mappings + HASH_POSITION (ht, mp->key);
393         /* We don't need to test for uniqueness of keys because they
394            come from the hash table and are therefore known to be
395            unique.  */
396         LOOP_NON_EMPTY (new_mp, mappings, newsize)
397           ;
398         *new_mp = *mp;
399       }
400
401   xfree (old_mappings);
402 }
403
404 /* Put VALUE in the hash table HT under the key KEY.  This regrows the
405    table if necessary.  */
406
407 void
408 hash_table_put (struct hash_table *ht, const void *key, void *value)
409 {
410   struct mapping *mp = find_mapping (ht, key);
411   if (NON_EMPTY (mp))
412     {
413       /* update existing item */
414       mp->key   = (void *)key; /* const? */
415       mp->value = value;
416       return;
417     }
418
419   /* If adding the item would make the table exceed max. fullness,
420      grow the table first.  */
421   if (ht->count >= ht->resize_threshold)
422     {
423       grow_hash_table (ht);
424       mp = find_mapping (ht, key);
425     }
426
427   /* add new item */
428   ++ht->count;
429   mp->key   = (void *)key;      /* const? */
430   mp->value = value;
431 }
432
433 /* Remove a mapping that matches KEY from HT.  Return 0 if there was
434    no such entry; return 1 if an entry was removed.  */
435
436 int
437 hash_table_remove (struct hash_table *ht, const void *key)
438 {
439   struct mapping *mp = find_mapping (ht, key);
440   if (!NON_EMPTY (mp))
441     return 0;
442   else
443     {
444       int size = ht->size;
445       struct mapping *mappings = ht->mappings;
446
447       mp->key = NULL;
448       --ht->count;
449
450       /* Rehash all the entries following MP.  The alternative
451          approach is to mark the entry as deleted, i.e. create a
452          "tombstone".  That makes remove faster, but leaves a lot of
453          garbage and slows down hash_table_get and hash_table_put.  */
454
455       mp = NEXT_MAPPING (mp, mappings, size);
456       LOOP_NON_EMPTY (mp, mappings, size)
457         {
458           const void *key2 = mp->key;
459           struct mapping *mp_new = mappings + HASH_POSITION (ht, key2);
460
461           /* Find the new location for the key. */
462
463           LOOP_NON_EMPTY (mp_new, mappings, size)
464             if (key2 == mp_new->key)
465               /* The mapping MP (key2) is already where we want it (in
466                  MP_NEW's "chain" of keys.)  */
467               goto next_rehash;
468
469           *mp_new = *mp;
470           mp->key = NULL;
471
472         next_rehash:
473           ;
474         }
475       return 1;
476     }
477 }
478
479 /* Clear HT of all entries.  After calling this function, the count
480    and the fullness of the hash table will be zero.  The size will
481    remain unchanged.  */
482
483 void
484 hash_table_clear (struct hash_table *ht)
485 {
486   memset (ht->mappings, '\0', ht->size * sizeof (struct mapping));
487   ht->count = 0;
488 }
489
490 /* Map MAPFUN over all the mappings in hash table HT.  MAPFUN is
491    called with three arguments: the key, the value, and MAPARG.
492
493    It is undefined what happens if you add or remove entries in the
494    hash table while hash_table_map is running.  The exception is the
495    entry you're currently mapping over; you may remove or change that
496    entry.  */
497
498 void
499 hash_table_map (struct hash_table *ht,
500                 int (*mapfun) (void *, void *, void *),
501                 void *maparg)
502 {
503   struct mapping *mp  = ht->mappings;
504   struct mapping *end = ht->mappings + ht->size;
505
506   for (; mp < end; mp++)
507     if (NON_EMPTY (mp))
508       {
509         void *key;
510       repeat:
511         key = mp->key;
512         if (mapfun (key, mp->value, maparg))
513           return;
514         /* hash_table_remove might have moved the adjacent
515            mappings. */
516         if (mp->key != key && NON_EMPTY (mp))
517           goto repeat;
518       }
519 }
520
521 /* Return the number of elements in the hash table.  This is not the
522    same as the physical size of the hash table, which is always
523    greater than the number of elements.  */
524
525 int
526 hash_table_count (const struct hash_table *ht)
527 {
528   return ht->count;
529 }
530 \f
531 /* Functions from this point onward are meant for convenience and
532    don't strictly belong to this file.  However, this is as good a
533    place for them as any.  */
534
535 /*
536  * Support for hash tables whose keys are strings.
537  *
538  */
539    
540 /* 31 bit hash function.  Taken from Gnome's glib, modified to use
541    standard C types.
542
543    We used to use the popular hash function from the Dragon Book, but
544    this one seems to perform much better.  */
545
546 unsigned long
547 string_hash (const void *key)
548 {
549   const char *p = key;
550   unsigned int h = *p;
551   
552   if (h)
553     for (p += 1; *p != '\0'; p++)
554       h = (h << 5) - h + *p;
555   
556   return h;
557 }
558
559 /* Frontend for strcmp usable for hash tables. */
560
561 int
562 string_cmp (const void *s1, const void *s2)
563 {
564   return !strcmp ((const char *)s1, (const char *)s2);
565 }
566
567 /* Return a hash table of preallocated to store at least ITEMS items
568    suitable to use strings as keys.  */
569
570 struct hash_table *
571 make_string_hash_table (int items)
572 {
573   return hash_table_new (items, string_hash, string_cmp);
574 }
575
576 /*
577  * Support for hash tables whose keys are strings, but which are
578  * compared case-insensitively.
579  *
580  */
581
582 /* Like string_hash, but produce the same hash regardless of the case. */
583
584 static unsigned long
585 string_hash_nocase (const void *key)
586 {
587   const char *p = key;
588   unsigned int h = TOLOWER (*p);
589   
590   if (h)
591     for (p += 1; *p != '\0'; p++)
592       h = (h << 5) - h + TOLOWER (*p);
593   
594   return h;
595 }
596
597 /* Like string_cmp, but doing case-insensitive compareison. */
598
599 static int
600 string_cmp_nocase (const void *s1, const void *s2)
601 {
602   return !strcasecmp ((const char *)s1, (const char *)s2);
603 }
604
605 /* Like make_string_hash_table, but uses string_hash_nocase and
606    string_cmp_nocase.  */
607
608 struct hash_table *
609 make_nocase_string_hash_table (int items)
610 {
611   return hash_table_new (items, string_hash_nocase, string_cmp_nocase);
612 }
613
614 /* Hashing of pointers.  Used for hash tables that are keyed by
615    pointer identity.  (Common Lisp calls them EQ hash tables, and Java
616    calls them IdentityHashMaps.)  */
617
618 static unsigned long
619 ptrhash (const void *ptr)
620 {
621   unsigned long key = (unsigned long)ptr;
622   key += (key << 12);
623   key ^= (key >> 22);
624   key += (key << 4);
625   key ^= (key >> 9);
626   key += (key << 10);
627   key ^= (key >> 2);
628   key += (key << 7);
629   key ^= (key >> 12);
630 #if SIZEOF_LONG > 4
631   key += (key << 44);
632   key ^= (key >> 54);
633   key += (key << 36);
634   key ^= (key >> 41);
635   key += (key << 42);
636   key ^= (key >> 34);
637   key += (key << 39);
638   key ^= (key >> 44);
639 #endif
640   return key;
641 }
642
643 static int
644 ptrcmp (const void *ptr1, const void *ptr2)
645 {
646   return ptr1 == ptr2;
647 }
648 \f
649 #ifdef STANDALONE
650
651 #include <stdio.h>
652 #include <string.h>
653
654 int
655 print_hash_table_mapper (void *key, void *value, void *count)
656 {
657   ++*(int *)count;
658   printf ("%s: %s\n", (const char *)key, (char *)value);
659   return 0;
660 }
661
662 void
663 print_hash (struct hash_table *sht)
664 {
665   int debug_count = 0;
666   hash_table_map (sht, print_hash_table_mapper, &debug_count);
667   assert (debug_count == sht->count);
668 }
669
670 int
671 main (void)
672 {
673   struct hash_table *ht = make_string_hash_table (0);
674   char line[80];
675   while ((fgets (line, sizeof (line), stdin)))
676     {
677       int len = strlen (line);
678       if (len <= 1)
679         continue;
680       line[--len] = '\0';
681       if (!hash_table_contains (ht, line))
682         hash_table_put (ht, strdup (line), "here I am!");
683 #if 1
684       if (len % 5 == 0)
685         {
686           char *line_copy;
687           if (hash_table_get_pair (ht, line, &line_copy, NULL))
688             {
689               hash_table_remove (ht, line);
690               xfree (line_copy);
691             }
692         }
693 #endif
694     }
695 #if 0
696   print_hash (ht);
697 #endif
698 #if 1
699   printf ("%d %d\n", ht->count, ht->size);
700 #endif
701   return 0;
702 }
703 #endif