]> sjero.net Git - wget/blob - src/hash.c
91abee481eb9d74c1b609f3f9673da9d99870bc7
[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 /* When hash table's fullness exceeds this threshold, the hash table
149    is resized.  */
150 #define HASH_FULLNESS_THRESHOLD 0.75
151
152 /* The hash table size is multiplied by this factor with each resize.
153    This guarantees infrequent resizes.  */
154 #define HASH_RESIZE_FACTOR 2
155
156 struct mapping {
157   void *key;
158   void *value;
159 };
160
161 struct hash_table {
162   unsigned long (*hash_function) PARAMS ((const void *));
163   int (*test_function) PARAMS ((const void *, const void *));
164
165   int size;                     /* size of the array */
166   int count;                    /* number of non-empty, non-deleted
167                                    fields. */
168
169   int resize_threshold;         /* after size exceeds this number of
170                                    entries, resize the table.  */
171   int prime_offset;             /* the offset of the current prime in
172                                    the prime table. */
173
174   struct mapping *mappings;     /* the array of mapping pairs. */
175 };
176
177 /* We use NULL key to mark a mapping as empty.  It is consequently
178    illegal to store NULL keys.  */
179 #define NON_EMPTY(mp) (mp->key != NULL)
180
181 /* "Next" mapping is the mapping after MP, but wrapping back to
182    MAPPINGS when MP would reach MAPPINGS+SIZE.  */
183 #define NEXT_MAPPING(mp, mappings, size) (mp != mappings + (size - 1)   \
184                                           ? mp + 1 : mappings)
185
186 /* Loop over non-empty mappings starting at MP. */
187 #define LOOP_NON_EMPTY(mp, mappings, size)                              \
188   for (; NON_EMPTY (mp); mp = NEXT_MAPPING (mp, mappings, size))
189
190 /* #### We might want to multiply with the "golden ratio" here to get
191    better randomness for keys that do not result from a good hash
192    function.  This is currently not a problem in Wget because we only
193    use the string hash tables.  */
194
195 #define HASH_POSITION(ht, key) (ht->hash_function (key) % ht->size)
196
197 /* Find a prime near, but greather than or equal to SIZE.  Of course,
198    the primes are not calculated, but looked up from a table.  The
199    table does not contain all primes in range, just a selection useful
200    for this purpose.
201
202    PRIME_OFFSET is a minor optimization: if specified, it starts the
203    search for the prime number beginning with the specific offset in
204    the prime number table.  The final offset is stored in the same
205    variable.  */
206
207 static int
208 prime_size (int size, int *prime_offset)
209 {
210   static const unsigned long primes [] = {
211     13, 19, 29, 41, 59, 79, 107, 149, 197, 263, 347, 457, 599, 787, 1031,
212     1361, 1777, 2333, 3037, 3967, 5167, 6719, 8737, 11369, 14783,
213     19219, 24989, 32491, 42257, 54941, 71429, 92861, 120721, 156941,
214     204047, 265271, 344857, 448321, 582821, 757693, 985003, 1280519,
215     1664681, 2164111, 2813353, 3657361, 4754591, 6180989, 8035301,
216     10445899, 13579681, 17653589, 22949669, 29834603, 38784989,
217     50420551, 65546729, 85210757, 110774011, 144006217, 187208107,
218     243370577, 316381771, 411296309, 534685237, 695090819, 903618083,
219     1174703521, 1527114613, 1985248999,
220     (unsigned long)0x99d43ea5, (unsigned long)0xc7fa5177
221   };
222   int i = *prime_offset;
223
224   for (; i < countof (primes); i++)
225     if (primes[i] >= size)
226       {
227         /* Set the offset to the next prime.  That is safe because,
228            next time we are called, it will be with a larger SIZE,
229            which means we could never return the same prime anyway.
230            (If that is not the case, the caller can simply reset
231            *prime_offset.)  */
232         *prime_offset = i + 1;
233         return primes[i];
234       }
235
236   abort ();
237   return 0;
238 }
239
240 /* Create a hash table with hash function HASH_FUNCTION and test
241    function TEST_FUNCTION.  The table is empty (its count is 0), but
242    pre-allocated to store at least ITEMS items.
243
244    ITEMS is the number of items that the table can accept without
245    needing to resize.  It is useful when creating a table that is to
246    be immediately filled with a known number of items.  In that case,
247    the regrows are a waste of time, and specifying ITEMS correctly
248    will avoid them altogether.
249
250    Note that hash tables grow dynamically regardless of ITEMS.  The
251    only use of ITEMS is to preallocate the table and avoid unnecessary
252    dynamic regrows.  Don't bother making ITEMS prime because it's not
253    used as size unchanged.  To start with a small table that grows as
254    needed, simply specify zero ITEMS.
255
256    If HASH_FUNCTION is not provided, identity table is assumed,
257    i.e. key pointers are compared as keys.  If you want strings with
258    equal contents to hash the same, use make_string_hash_table.  */
259
260 struct hash_table *
261 hash_table_new (int items,
262                 unsigned long (*hash_function) (const void *),
263                 int (*test_function) (const void *, const void *))
264 {
265   int size;
266   struct hash_table *ht
267     = (struct hash_table *)xmalloc (sizeof (struct hash_table));
268
269   ht->hash_function = hash_function ? hash_function : ptrhash;
270   ht->test_function = test_function ? test_function : ptrcmp;
271
272   ht->prime_offset = 0;
273
274   /* Calculate the size that ensures that the table will store at
275      least ITEMS keys without the need to resize.  */
276   size = 1 + items / HASH_FULLNESS_THRESHOLD;
277   size = prime_size (size, &ht->prime_offset);
278   ht->size = size;
279   ht->resize_threshold = size * HASH_FULLNESS_THRESHOLD;
280   /*assert (ht->resize_threshold >= items);*/
281
282   ht->mappings = xmalloc (ht->size * sizeof (struct mapping));
283   memset (ht->mappings, '\0', ht->size * sizeof (struct mapping));
284
285   ht->count = 0;
286
287   return ht;
288 }
289
290 /* Free the data associated with hash table HT. */
291
292 void
293 hash_table_destroy (struct hash_table *ht)
294 {
295   xfree (ht->mappings);
296   xfree (ht);
297 }
298
299 /* The heart of most functions in this file -- find the mapping whose
300    KEY is equal to key, using linear probing.  Returns the mapping
301    that matches KEY, or the first empty mapping if none matches.  */
302
303 static inline struct mapping *
304 find_mapping (const struct hash_table *ht, const void *key)
305 {
306   struct mapping *mappings = ht->mappings;
307   int size = ht->size;
308   struct mapping *mp = mappings + HASH_POSITION (ht, key);
309   int (*equals) PARAMS ((const void *, const void *)) = ht->test_function;
310
311   LOOP_NON_EMPTY (mp, mappings, size)
312     if (equals (key, mp->key))
313       break;
314   return mp;
315 }
316
317 /* Get the value that corresponds to the key KEY in the hash table HT.
318    If no value is found, return NULL.  Note that NULL is a legal value
319    for value; if you are storing NULLs in your hash table, you can use
320    hash_table_contains to be sure that a (possibly NULL) value exists
321    in the table.  Or, you can use hash_table_get_pair instead of this
322    function.  */
323
324 void *
325 hash_table_get (const struct hash_table *ht, const void *key)
326 {
327   struct mapping *mp = find_mapping (ht, key);
328   if (NON_EMPTY (mp))
329     return mp->value;
330   else
331     return NULL;
332 }
333
334 /* Like hash_table_get, but writes out the pointers to both key and
335    value.  Returns non-zero on success.  */
336
337 int
338 hash_table_get_pair (const struct hash_table *ht, const void *lookup_key,
339                      void *orig_key, void *value)
340 {
341   struct mapping *mp = find_mapping (ht, lookup_key);
342   if (NON_EMPTY (mp))
343     {
344       if (orig_key)
345         *(void **)orig_key = mp->key;
346       if (value)
347         *(void **)value = mp->value;
348       return 1;
349     }
350   else
351     return 0;
352 }
353
354 /* Return 1 if HT contains KEY, 0 otherwise. */
355
356 int
357 hash_table_contains (const struct hash_table *ht, const void *key)
358 {
359   struct mapping *mp = find_mapping (ht, key);
360   return NON_EMPTY (mp);
361 }
362
363 /* Grow hash table HT as necessary, and rehash all the key-value
364    mappings.  */
365
366 static void
367 grow_hash_table (struct hash_table *ht)
368 {
369   struct mapping *old_mappings = ht->mappings;
370   struct mapping *old_end      = ht->mappings + ht->size;
371   struct mapping *mp, *mappings;
372   int newsize;
373
374   newsize = prime_size (ht->size * HASH_RESIZE_FACTOR, &ht->prime_offset);
375 #if 0
376   printf ("growing from %d to %d; fullness %.2f%% to %.2f%%\n",
377           ht->size, newsize,
378           100.0 * ht->count / ht->size,
379           100.0 * ht->count / newsize);
380 #endif
381
382   ht->size = newsize;
383   ht->resize_threshold = newsize * HASH_FULLNESS_THRESHOLD;
384
385   mappings = xmalloc (ht->size * sizeof (struct mapping));
386   memset (mappings, '\0', ht->size * sizeof (struct mapping));
387   ht->mappings = mappings;
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 all
394            the keys come from the hash table and are therefore known
395            to be 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 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 int
644 ptrcmp (const void *ptr1, const void *ptr2)
645 {
646   return ptr1 == ptr2;
647 }
648
649 #if 0
650 /* Currently unused: hashing of integers. */
651
652 unsigned long
653 inthash (unsigned int key)
654 {
655   key += (key << 12);
656   key ^= (key >> 22);
657   key += (key << 4);
658   key ^= (key >> 9);
659   key += (key << 10);
660   key ^= (key >> 2);
661   key += (key << 7);
662   key ^= (key >> 12);
663   return key;
664 }
665 #endif
666 \f
667 #ifdef STANDALONE
668
669 #include <stdio.h>
670 #include <string.h>
671
672 int
673 print_hash_table_mapper (void *key, void *value, void *count)
674 {
675   ++*(int *)count;
676   printf ("%s: %s\n", (const char *)key, (char *)value);
677   return 0;
678 }
679
680 void
681 print_hash (struct hash_table *sht)
682 {
683   int debug_count = 0;
684   hash_table_map (sht, print_hash_table_mapper, &debug_count);
685   assert (debug_count == sht->count);
686 }
687
688 int
689 main (void)
690 {
691   struct hash_table *ht = make_string_hash_table (0);
692   char line[80];
693   while ((fgets (line, sizeof (line), stdin)))
694     {
695       int len = strlen (line);
696       if (len <= 1)
697         continue;
698       line[--len] = '\0';
699       if (!hash_table_contains (ht, line))
700         hash_table_put (ht, strdup (line), "here I am!");
701 #if 1
702       if (len % 5 == 0)
703         {
704           char *line_copy;
705           if (hash_table_get_pair (ht, line, &line_copy, NULL))
706             {
707               hash_table_remove (ht, line);
708               xfree (line_copy);
709             }
710         }
711 #endif
712     }
713 #if 0
714   print_hash (ht);
715 #endif
716 #if 1
717   printf ("%d %d\n", ht->count, ht->size);
718 #endif
719   return 0;
720 }
721 #endif