]> sjero.net Git - wget/blob - src/hash.c
[svn] Use new macros xnew, xnew0, xnew_array, and xnew0_array in various places.
[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 = xnew (struct hash_table);
267
268   ht->hash_function = hash_function ? hash_function : ptrhash;
269   ht->test_function = test_function ? test_function : ptrcmp;
270
271   ht->prime_offset = 0;
272
273   /* Calculate the size that ensures that the table will store at
274      least ITEMS keys without the need to resize.  */
275   size = 1 + items / HASH_FULLNESS_THRESHOLD;
276   size = prime_size (size, &ht->prime_offset);
277   ht->size = size;
278   ht->resize_threshold = size * HASH_FULLNESS_THRESHOLD;
279   /*assert (ht->resize_threshold >= items);*/
280
281   ht->mappings = xnew0_array (struct mapping, ht->size);
282   ht->count = 0;
283
284   return ht;
285 }
286
287 /* Free the data associated with hash table HT. */
288
289 void
290 hash_table_destroy (struct hash_table *ht)
291 {
292   xfree (ht->mappings);
293   xfree (ht);
294 }
295
296 /* The heart of most functions in this file -- find the mapping whose
297    KEY is equal to key, using linear probing.  Returns the mapping
298    that matches KEY, or the first empty mapping if none matches.  */
299
300 static inline struct mapping *
301 find_mapping (const struct hash_table *ht, const void *key)
302 {
303   struct mapping *mappings = ht->mappings;
304   int size = ht->size;
305   struct mapping *mp = mappings + HASH_POSITION (ht, key);
306   int (*equals) PARAMS ((const void *, const void *)) = ht->test_function;
307
308   LOOP_NON_EMPTY (mp, mappings, size)
309     if (equals (key, mp->key))
310       break;
311   return mp;
312 }
313
314 /* Get the value that corresponds to the key KEY in the hash table HT.
315    If no value is found, return NULL.  Note that NULL is a legal value
316    for value; if you are storing NULLs in your hash table, you can use
317    hash_table_contains to be sure that a (possibly NULL) value exists
318    in the table.  Or, you can use hash_table_get_pair instead of this
319    function.  */
320
321 void *
322 hash_table_get (const struct hash_table *ht, const void *key)
323 {
324   struct mapping *mp = find_mapping (ht, key);
325   if (NON_EMPTY (mp))
326     return mp->value;
327   else
328     return NULL;
329 }
330
331 /* Like hash_table_get, but writes out the pointers to both key and
332    value.  Returns non-zero on success.  */
333
334 int
335 hash_table_get_pair (const struct hash_table *ht, const void *lookup_key,
336                      void *orig_key, void *value)
337 {
338   struct mapping *mp = find_mapping (ht, lookup_key);
339   if (NON_EMPTY (mp))
340     {
341       if (orig_key)
342         *(void **)orig_key = mp->key;
343       if (value)
344         *(void **)value = mp->value;
345       return 1;
346     }
347   else
348     return 0;
349 }
350
351 /* Return 1 if HT contains KEY, 0 otherwise. */
352
353 int
354 hash_table_contains (const struct hash_table *ht, const void *key)
355 {
356   struct mapping *mp = find_mapping (ht, key);
357   return NON_EMPTY (mp);
358 }
359
360 /* Grow hash table HT as necessary, and rehash all the key-value
361    mappings.  */
362
363 static void
364 grow_hash_table (struct hash_table *ht)
365 {
366   struct mapping *old_mappings = ht->mappings;
367   struct mapping *old_end      = ht->mappings + ht->size;
368   struct mapping *mp, *mappings;
369   int newsize;
370
371   newsize = prime_size (ht->size * HASH_RESIZE_FACTOR, &ht->prime_offset);
372 #if 0
373   printf ("growing from %d to %d; fullness %.2f%% to %.2f%%\n",
374           ht->size, newsize,
375           100.0 * ht->count / ht->size,
376           100.0 * ht->count / newsize);
377 #endif
378
379   ht->size = newsize;
380   ht->resize_threshold = newsize * HASH_FULLNESS_THRESHOLD;
381
382   ht->mappings = mappings = xnew0_array (struct mapping, ht->size);
383
384   for (mp = old_mappings; mp < old_end; mp++)
385     if (NON_EMPTY (mp))
386       {
387         struct mapping *new_mp = mappings + HASH_POSITION (ht, mp->key);
388         /* We don't need to test for uniqueness of keys because all
389            the keys come from the hash table and are therefore known
390            to be unique.  */
391         LOOP_NON_EMPTY (new_mp, mappings, newsize)
392           ;
393         *new_mp = *mp;
394       }
395
396   xfree (old_mappings);
397 }
398
399 /* Put VALUE in the hash table HT under the key KEY.  This regrows the
400    table if necessary.  */
401
402 void
403 hash_table_put (struct hash_table *ht, const void *key, void *value)
404 {
405   struct mapping *mp = find_mapping (ht, key);
406   if (NON_EMPTY (mp))
407     {
408       /* update existing item */
409       mp->key   = (void *)key; /* const? */
410       mp->value = value;
411       return;
412     }
413
414   /* If adding the item would make the table exceed max. fullness,
415      grow the table first.  */
416   if (ht->count >= ht->resize_threshold)
417     {
418       grow_hash_table (ht);
419       mp = find_mapping (ht, key);
420     }
421
422   /* add new item */
423   ++ht->count;
424   mp->key   = (void *)key;      /* const? */
425   mp->value = value;
426 }
427
428 /* Remove a mapping that matches KEY from HT.  Return 0 if there was
429    no such entry; return 1 if an entry was removed.  */
430
431 int
432 hash_table_remove (struct hash_table *ht, const void *key)
433 {
434   struct mapping *mp = find_mapping (ht, key);
435   if (!NON_EMPTY (mp))
436     return 0;
437   else
438     {
439       int size = ht->size;
440       struct mapping *mappings = ht->mappings;
441
442       mp->key = NULL;
443       --ht->count;
444
445       /* Rehash all the entries following MP.  The alternative
446          approach is to mark the entry as deleted, i.e. create a
447          "tombstone".  That makes remove faster, but leaves a lot of
448          garbage and slows down hash_table_get and hash_table_put.  */
449
450       mp = NEXT_MAPPING (mp, mappings, size);
451       LOOP_NON_EMPTY (mp, mappings, size)
452         {
453           const void *key2 = mp->key;
454           struct mapping *mp_new = mappings + HASH_POSITION (ht, key2);
455
456           /* Find the new location for the key. */
457
458           LOOP_NON_EMPTY (mp_new, mappings, size)
459             if (key2 == mp_new->key)
460               /* The mapping MP (key2) is already where we want it (in
461                  MP_NEW's "chain" of keys.)  */
462               goto next_rehash;
463
464           *mp_new = *mp;
465           mp->key = NULL;
466
467         next_rehash:
468           ;
469         }
470       return 1;
471     }
472 }
473
474 /* Clear HT of all entries.  After calling this function, the count
475    and the fullness of the hash table will be zero.  The size will
476    remain unchanged.  */
477
478 void
479 hash_table_clear (struct hash_table *ht)
480 {
481   memset (ht->mappings, '\0', ht->size * sizeof (struct mapping));
482   ht->count = 0;
483 }
484
485 /* Map MAPFUN over all the mappings in hash table HT.  MAPFUN is
486    called with three arguments: the key, the value, and MAPARG.
487
488    It is undefined what happens if you add or remove entries in the
489    hash table while hash_table_map is running.  The exception is the
490    entry you're currently mapping over; you may remove or change that
491    entry.  */
492
493 void
494 hash_table_map (struct hash_table *ht,
495                 int (*mapfun) (void *, void *, void *),
496                 void *maparg)
497 {
498   struct mapping *mp  = ht->mappings;
499   struct mapping *end = ht->mappings + ht->size;
500
501   for (; mp < end; mp++)
502     if (NON_EMPTY (mp))
503       {
504         void *key;
505       repeat:
506         key = mp->key;
507         if (mapfun (key, mp->value, maparg))
508           return;
509         /* hash_table_remove might have moved the adjacent
510            mappings. */
511         if (mp->key != key && NON_EMPTY (mp))
512           goto repeat;
513       }
514 }
515
516 /* Return the number of elements in the hash table.  This is not the
517    same as the physical size of the hash table, which is always
518    greater than the number of elements.  */
519
520 int
521 hash_table_count (const struct hash_table *ht)
522 {
523   return ht->count;
524 }
525 \f
526 /* Functions from this point onward are meant for convenience and
527    don't strictly belong to this file.  However, this is as good a
528    place for them as any.  */
529
530 /*
531  * Support for hash tables whose keys are strings.
532  *
533  */
534    
535 /* 31 bit hash function.  Taken from Gnome's glib, modified to use
536    standard C types.
537
538    We used to use the popular hash function from the Dragon Book, but
539    this one seems to perform much better.  */
540
541 unsigned long
542 string_hash (const void *key)
543 {
544   const char *p = key;
545   unsigned int h = *p;
546   
547   if (h)
548     for (p += 1; *p != '\0'; p++)
549       h = (h << 5) - h + *p;
550   
551   return h;
552 }
553
554 /* Frontend for strcmp usable for hash tables. */
555
556 int
557 string_cmp (const void *s1, const void *s2)
558 {
559   return !strcmp ((const char *)s1, (const char *)s2);
560 }
561
562 /* Return a hash table of preallocated to store at least ITEMS items
563    suitable to use strings as keys.  */
564
565 struct hash_table *
566 make_string_hash_table (int items)
567 {
568   return hash_table_new (items, string_hash, string_cmp);
569 }
570
571 /*
572  * Support for hash tables whose keys are strings, but which are
573  * compared case-insensitively.
574  *
575  */
576
577 /* Like string_hash, but produce the same hash regardless of the case. */
578
579 static unsigned long
580 string_hash_nocase (const void *key)
581 {
582   const char *p = key;
583   unsigned int h = TOLOWER (*p);
584   
585   if (h)
586     for (p += 1; *p != '\0'; p++)
587       h = (h << 5) - h + TOLOWER (*p);
588   
589   return h;
590 }
591
592 /* Like string_cmp, but doing case-insensitive compareison. */
593
594 static int
595 string_cmp_nocase (const void *s1, const void *s2)
596 {
597   return !strcasecmp ((const char *)s1, (const char *)s2);
598 }
599
600 /* Like make_string_hash_table, but uses string_hash_nocase and
601    string_cmp_nocase.  */
602
603 struct hash_table *
604 make_nocase_string_hash_table (int items)
605 {
606   return hash_table_new (items, string_hash_nocase, string_cmp_nocase);
607 }
608
609 /* Hashing of pointers.  Used for hash tables that are keyed by
610    pointer identity.  (Common Lisp calls them EQ hash tables, and Java
611    calls them IdentityHashMaps.)  */
612
613 unsigned long
614 ptrhash (const void *ptr)
615 {
616   unsigned long key = (unsigned long)ptr;
617   key += (key << 12);
618   key ^= (key >> 22);
619   key += (key << 4);
620   key ^= (key >> 9);
621   key += (key << 10);
622   key ^= (key >> 2);
623   key += (key << 7);
624   key ^= (key >> 12);
625 #if SIZEOF_LONG > 4
626   key += (key << 44);
627   key ^= (key >> 54);
628   key += (key << 36);
629   key ^= (key >> 41);
630   key += (key << 42);
631   key ^= (key >> 34);
632   key += (key << 39);
633   key ^= (key >> 44);
634 #endif
635   return key;
636 }
637
638 int
639 ptrcmp (const void *ptr1, const void *ptr2)
640 {
641   return ptr1 == ptr2;
642 }
643
644 #if 0
645 /* Currently unused: hashing of integers. */
646
647 unsigned long
648 inthash (unsigned int key)
649 {
650   key += (key << 12);
651   key ^= (key >> 22);
652   key += (key << 4);
653   key ^= (key >> 9);
654   key += (key << 10);
655   key ^= (key >> 2);
656   key += (key << 7);
657   key ^= (key >> 12);
658   return key;
659 }
660 #endif
661 \f
662 #ifdef STANDALONE
663
664 #include <stdio.h>
665 #include <string.h>
666
667 int
668 print_hash_table_mapper (void *key, void *value, void *count)
669 {
670   ++*(int *)count;
671   printf ("%s: %s\n", (const char *)key, (char *)value);
672   return 0;
673 }
674
675 void
676 print_hash (struct hash_table *sht)
677 {
678   int debug_count = 0;
679   hash_table_map (sht, print_hash_table_mapper, &debug_count);
680   assert (debug_count == sht->count);
681 }
682
683 int
684 main (void)
685 {
686   struct hash_table *ht = make_string_hash_table (0);
687   char line[80];
688   while ((fgets (line, sizeof (line), stdin)))
689     {
690       int len = strlen (line);
691       if (len <= 1)
692         continue;
693       line[--len] = '\0';
694       if (!hash_table_contains (ht, line))
695         hash_table_put (ht, strdup (line), "here I am!");
696 #if 1
697       if (len % 5 == 0)
698         {
699           char *line_copy;
700           if (hash_table_get_pair (ht, line, &line_copy, NULL))
701             {
702               hash_table_remove (ht, line);
703               xfree (line_copy);
704             }
705         }
706 #endif
707     }
708 #if 0
709   print_hash (ht);
710 #endif
711 #if 1
712   printf ("%d %d\n", ht->count, ht->size);
713 #endif
714   return 0;
715 }
716 #endif