]> sjero.net Git - wget/blob - src/hash.c
[svn] Renamed HASH_FULLNESS_THRESHOLD to HASH_MAX_FULLNESS.
[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 /* Create a hash table with hash function HASH_FUNCTION and test
242    function TEST_FUNCTION.  The table is empty (its count is 0), but
243    pre-allocated to store at least ITEMS items.
244
245    ITEMS is the number of items that the table can accept without
246    needing to resize.  It is useful when creating a table that is to
247    be immediately filled with a known number of items.  In that case,
248    the regrows are a waste of time, and specifying ITEMS correctly
249    will avoid them altogether.
250
251    Note that hash tables grow dynamically regardless of ITEMS.  The
252    only use of ITEMS is to preallocate the table and avoid unnecessary
253    dynamic regrows.  Don't bother making ITEMS prime because it's not
254    used as size unchanged.  To start with a small table that grows as
255    needed, simply specify zero ITEMS.
256
257    If HASH_FUNCTION is not provided, identity table is assumed,
258    i.e. key pointers are compared as keys.  If you want strings with
259    equal contents to hash the same, use make_string_hash_table.  */
260
261 struct hash_table *
262 hash_table_new (int items,
263                 unsigned long (*hash_function) (const void *),
264                 int (*test_function) (const void *, const void *))
265 {
266   int size;
267   struct hash_table *ht = xnew (struct hash_table);
268
269   ht->hash_function = hash_function ? hash_function : ptrhash;
270   ht->test_function = test_function ? test_function : ptrcmp;
271
272   /* If the size of struct hash_table ever becomes a concern, this
273      field can go.  (Wget doesn't create many hashes.)  */
274   ht->prime_offset = 0;
275
276   /* Calculate the size that ensures that the table will store at
277      least ITEMS keys without the need to resize.  */
278   size = 1 + items / HASH_MAX_FULLNESS;
279   size = prime_size (size, &ht->prime_offset);
280   ht->size = size;
281   ht->resize_threshold = size * HASH_MAX_FULLNESS;
282   /*assert (ht->resize_threshold >= items);*/
283
284   ht->mappings = xnew0_array (struct mapping, ht->size);
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_MAX_FULLNESS;
384   ht->mappings = mappings = xnew0_array (struct mapping, ht->size);
385
386   for (mp = old_mappings; mp < old_end; mp++)
387     if (NON_EMPTY (mp))
388       {
389         struct mapping *new_mp = mappings + HASH_POSITION (ht, mp->key);
390         /* We don't need to test for uniqueness of keys because they
391            come from the hash table and are therefore known to be
392            unique.  */
393         LOOP_NON_EMPTY (new_mp, mappings, newsize)
394           ;
395         *new_mp = *mp;
396       }
397
398   xfree (old_mappings);
399 }
400
401 /* Put VALUE in the hash table HT under the key KEY.  This regrows the
402    table if necessary.  */
403
404 void
405 hash_table_put (struct hash_table *ht, const void *key, void *value)
406 {
407   struct mapping *mp = find_mapping (ht, key);
408   if (NON_EMPTY (mp))
409     {
410       /* update existing item */
411       mp->key   = (void *)key; /* const? */
412       mp->value = value;
413       return;
414     }
415
416   /* If adding the item would make the table exceed max. fullness,
417      grow the table first.  */
418   if (ht->count >= ht->resize_threshold)
419     {
420       grow_hash_table (ht);
421       mp = find_mapping (ht, key);
422     }
423
424   /* add new item */
425   ++ht->count;
426   mp->key   = (void *)key;      /* const? */
427   mp->value = value;
428 }
429
430 /* Remove a mapping that matches KEY from HT.  Return 0 if there was
431    no such entry; return 1 if an entry was removed.  */
432
433 int
434 hash_table_remove (struct hash_table *ht, const void *key)
435 {
436   struct mapping *mp = find_mapping (ht, key);
437   if (!NON_EMPTY (mp))
438     return 0;
439   else
440     {
441       int size = ht->size;
442       struct mapping *mappings = ht->mappings;
443
444       mp->key = NULL;
445       --ht->count;
446
447       /* Rehash all the entries following MP.  The alternative
448          approach is to mark the entry as deleted, i.e. create a
449          "tombstone".  That makes remove faster, but leaves a lot of
450          garbage and slows down hash_table_get and hash_table_put.  */
451
452       mp = NEXT_MAPPING (mp, mappings, size);
453       LOOP_NON_EMPTY (mp, mappings, size)
454         {
455           const void *key2 = mp->key;
456           struct mapping *mp_new = mappings + HASH_POSITION (ht, key2);
457
458           /* Find the new location for the key. */
459
460           LOOP_NON_EMPTY (mp_new, mappings, size)
461             if (key2 == mp_new->key)
462               /* The mapping MP (key2) is already where we want it (in
463                  MP_NEW's "chain" of keys.)  */
464               goto next_rehash;
465
466           *mp_new = *mp;
467           mp->key = NULL;
468
469         next_rehash:
470           ;
471         }
472       return 1;
473     }
474 }
475
476 /* Clear HT of all entries.  After calling this function, the count
477    and the fullness of the hash table will be zero.  The size will
478    remain unchanged.  */
479
480 void
481 hash_table_clear (struct hash_table *ht)
482 {
483   memset (ht->mappings, '\0', ht->size * sizeof (struct mapping));
484   ht->count = 0;
485 }
486
487 /* Map MAPFUN over all the mappings in hash table HT.  MAPFUN is
488    called with three arguments: the key, the value, and MAPARG.
489
490    It is undefined what happens if you add or remove entries in the
491    hash table while hash_table_map is running.  The exception is the
492    entry you're currently mapping over; you may remove or change that
493    entry.  */
494
495 void
496 hash_table_map (struct hash_table *ht,
497                 int (*mapfun) (void *, void *, void *),
498                 void *maparg)
499 {
500   struct mapping *mp  = ht->mappings;
501   struct mapping *end = ht->mappings + ht->size;
502
503   for (; mp < end; mp++)
504     if (NON_EMPTY (mp))
505       {
506         void *key;
507       repeat:
508         key = mp->key;
509         if (mapfun (key, mp->value, maparg))
510           return;
511         /* hash_table_remove might have moved the adjacent
512            mappings. */
513         if (mp->key != key && NON_EMPTY (mp))
514           goto repeat;
515       }
516 }
517
518 /* Return the number of elements in the hash table.  This is not the
519    same as the physical size of the hash table, which is always
520    greater than the number of elements.  */
521
522 int
523 hash_table_count (const struct hash_table *ht)
524 {
525   return ht->count;
526 }
527 \f
528 /* Functions from this point onward are meant for convenience and
529    don't strictly belong to this file.  However, this is as good a
530    place for them as any.  */
531
532 /*
533  * Support for hash tables whose keys are strings.
534  *
535  */
536    
537 /* 31 bit hash function.  Taken from Gnome's glib, modified to use
538    standard C types.
539
540    We used to use the popular hash function from the Dragon Book, but
541    this one seems to perform much better.  */
542
543 unsigned long
544 string_hash (const void *key)
545 {
546   const char *p = key;
547   unsigned int h = *p;
548   
549   if (h)
550     for (p += 1; *p != '\0'; p++)
551       h = (h << 5) - h + *p;
552   
553   return h;
554 }
555
556 /* Frontend for strcmp usable for hash tables. */
557
558 int
559 string_cmp (const void *s1, const void *s2)
560 {
561   return !strcmp ((const char *)s1, (const char *)s2);
562 }
563
564 /* Return a hash table of preallocated to store at least ITEMS items
565    suitable to use strings as keys.  */
566
567 struct hash_table *
568 make_string_hash_table (int items)
569 {
570   return hash_table_new (items, string_hash, string_cmp);
571 }
572
573 /*
574  * Support for hash tables whose keys are strings, but which are
575  * compared case-insensitively.
576  *
577  */
578
579 /* Like string_hash, but produce the same hash regardless of the case. */
580
581 static unsigned long
582 string_hash_nocase (const void *key)
583 {
584   const char *p = key;
585   unsigned int h = TOLOWER (*p);
586   
587   if (h)
588     for (p += 1; *p != '\0'; p++)
589       h = (h << 5) - h + TOLOWER (*p);
590   
591   return h;
592 }
593
594 /* Like string_cmp, but doing case-insensitive compareison. */
595
596 static int
597 string_cmp_nocase (const void *s1, const void *s2)
598 {
599   return !strcasecmp ((const char *)s1, (const char *)s2);
600 }
601
602 /* Like make_string_hash_table, but uses string_hash_nocase and
603    string_cmp_nocase.  */
604
605 struct hash_table *
606 make_nocase_string_hash_table (int items)
607 {
608   return hash_table_new (items, string_hash_nocase, string_cmp_nocase);
609 }
610
611 /* Hashing of pointers.  Used for hash tables that are keyed by
612    pointer identity.  (Common Lisp calls them EQ hash tables, and Java
613    calls them IdentityHashMaps.)  */
614
615 unsigned long
616 ptrhash (const void *ptr)
617 {
618   unsigned long key = (unsigned long)ptr;
619   key += (key << 12);
620   key ^= (key >> 22);
621   key += (key << 4);
622   key ^= (key >> 9);
623   key += (key << 10);
624   key ^= (key >> 2);
625   key += (key << 7);
626   key ^= (key >> 12);
627 #if SIZEOF_LONG > 4
628   key += (key << 44);
629   key ^= (key >> 54);
630   key += (key << 36);
631   key ^= (key >> 41);
632   key += (key << 42);
633   key ^= (key >> 34);
634   key += (key << 39);
635   key ^= (key >> 44);
636 #endif
637   return key;
638 }
639
640 int
641 ptrcmp (const void *ptr1, const void *ptr2)
642 {
643   return ptr1 == ptr2;
644 }
645
646 #if 0
647 /* Currently unused: hashing of integers. */
648
649 unsigned long
650 inthash (unsigned int key)
651 {
652   key += (key << 12);
653   key ^= (key >> 22);
654   key += (key << 4);
655   key ^= (key >> 9);
656   key += (key << 10);
657   key ^= (key >> 2);
658   key += (key << 7);
659   key ^= (key >> 12);
660   return key;
661 }
662 #endif
663 \f
664 #ifdef STANDALONE
665
666 #include <stdio.h>
667 #include <string.h>
668
669 int
670 print_hash_table_mapper (void *key, void *value, void *count)
671 {
672   ++*(int *)count;
673   printf ("%s: %s\n", (const char *)key, (char *)value);
674   return 0;
675 }
676
677 void
678 print_hash (struct hash_table *sht)
679 {
680   int debug_count = 0;
681   hash_table_map (sht, print_hash_table_mapper, &debug_count);
682   assert (debug_count == sht->count);
683 }
684
685 int
686 main (void)
687 {
688   struct hash_table *ht = make_string_hash_table (0);
689   char line[80];
690   while ((fgets (line, sizeof (line), stdin)))
691     {
692       int len = strlen (line);
693       if (len <= 1)
694         continue;
695       line[--len] = '\0';
696       if (!hash_table_contains (ht, line))
697         hash_table_put (ht, strdup (line), "here I am!");
698 #if 1
699       if (len % 5 == 0)
700         {
701           char *line_copy;
702           if (hash_table_get_pair (ht, line, &line_copy, NULL))
703             {
704               hash_table_remove (ht, line);
705               xfree (line_copy);
706             }
707         }
708 #endif
709     }
710 #if 0
711   print_hash (ht);
712 #endif
713 #if 1
714   printf ("%d %d\n", ht->count, ht->size);
715 #endif
716   return 0;
717 }
718 #endif