]> sjero.net Git - wget/blob - src/hash.c
[svn] Allow NULL/0 as hash table keys.
[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 all-bit-set marker to mean that a mapping is empty.  It is
179    (hopefully) illegal as a pointer, and it allows the users to use
180    NULL (as well as any non-negative integer) as key.  */
181 #define NON_EMPTY(mp) (mp->key != (void *)~(unsigned long)0)
182
183 /* "Next" mapping is the mapping after MP, but wrapping back to
184    MAPPINGS when MP would reach MAPPINGS+SIZE.  */
185 #define NEXT_MAPPING(mp, mappings, size) (mp != mappings + (size - 1)   \
186                                           ? mp + 1 : mappings)
187
188 /* Loop over non-empty mappings starting at MP. */
189 #define LOOP_NON_EMPTY(mp, mappings, size)                              \
190   for (; NON_EMPTY (mp); mp = NEXT_MAPPING (mp, mappings, size))
191
192 /* #### We might want to multiply with the "golden ratio" here to get
193    better randomness for keys that do not result from a good hash
194    function.  This is currently not a problem in Wget because we only
195    use the string hash tables.  */
196
197 #define HASH_POSITION(ht, key) (ht->hash_function (key) % ht->size)
198
199 /* Find a prime near, but greather than or equal to SIZE.  Of course,
200    the primes are not calculated, but looked up from a table.  The
201    table does not contain all primes in range, just a selection useful
202    for this purpose.
203
204    PRIME_OFFSET is a minor optimization: if specified, it starts the
205    search for the prime number beginning with the specific offset in
206    the prime number table.  The final offset is stored in the same
207    variable.  */
208
209 static int
210 prime_size (int size, int *prime_offset)
211 {
212   static const unsigned long primes [] = {
213     13, 19, 29, 41, 59, 79, 107, 149, 197, 263, 347, 457, 599, 787, 1031,
214     1361, 1777, 2333, 3037, 3967, 5167, 6719, 8737, 11369, 14783,
215     19219, 24989, 32491, 42257, 54941, 71429, 92861, 120721, 156941,
216     204047, 265271, 344857, 448321, 582821, 757693, 985003, 1280519,
217     1664681, 2164111, 2813353, 3657361, 4754591, 6180989, 8035301,
218     10445899, 13579681, 17653589, 22949669, 29834603, 38784989,
219     50420551, 65546729, 85210757, 110774011, 144006217, 187208107,
220     243370577, 316381771, 411296309, 534685237, 695090819, 903618083,
221     1174703521, 1527114613, 1985248999,
222     (unsigned long)0x99d43ea5, (unsigned long)0xc7fa5177
223   };
224   int i = *prime_offset;
225
226   for (; i < countof (primes); i++)
227     if (primes[i] >= size)
228       {
229         /* Set the offset to the next prime.  That is safe because,
230            next time we are called, it will be with a larger SIZE,
231            which means we could never return the same prime anyway.
232            (If that is not the case, the caller can simply reset
233            *prime_offset.)  */
234         *prime_offset = i + 1;
235         return primes[i];
236       }
237
238   abort ();
239   return 0;
240 }
241
242 static unsigned long ptrhash PARAMS ((const void *));
243 static int ptrcmp PARAMS ((const void *, const void *));
244
245 /* Create a hash table with hash function HASH_FUNCTION and test
246    function TEST_FUNCTION.  The table is empty (its count is 0), but
247    pre-allocated to store at least ITEMS items.
248
249    ITEMS is the number of items that the table can accept without
250    needing to resize.  It is useful when creating a table that is to
251    be immediately filled with a known number of items.  In that case,
252    the regrows are a waste of time, and specifying ITEMS correctly
253    will avoid them altogether.
254
255    Note that hash tables grow dynamically regardless of ITEMS.  The
256    only use of ITEMS is to preallocate the table and avoid unnecessary
257    dynamic regrows.  Don't bother making ITEMS prime because it's not
258    used as size unchanged.  To start with a small table that grows as
259    needed, simply specify zero ITEMS.
260
261    If HASH_FUNCTION is not provided, identity table is assumed,
262    i.e. key pointers are compared as keys.  If you want strings with
263    equal contents to hash the same, use make_string_hash_table.  */
264
265 struct hash_table *
266 hash_table_new (int items,
267                 unsigned long (*hash_function) (const void *),
268                 int (*test_function) (const void *, const void *))
269 {
270   int size;
271   struct hash_table *ht = xnew (struct hash_table);
272
273   ht->hash_function = hash_function ? hash_function : ptrhash;
274   ht->test_function = test_function ? test_function : ptrcmp;
275
276   /* If the size of struct hash_table ever becomes a concern, this
277      field can go.  (Wget doesn't create many hashes.)  */
278   ht->prime_offset = 0;
279
280   /* Calculate the size that ensures that the table will store at
281      least ITEMS keys without the need to resize.  */
282   size = 1 + items / HASH_MAX_FULLNESS;
283   size = prime_size (size, &ht->prime_offset);
284   ht->size = size;
285   ht->resize_threshold = size * HASH_MAX_FULLNESS;
286   /*assert (ht->resize_threshold >= items);*/
287
288   ht->mappings = xnew_array (struct mapping, ht->size);
289   /* Mark mappings as empty.  We use 0xff rather than 0 to mark empty
290      keys because it allows us to store NULL keys to the table.  */
291   memset (ht->mappings, 255, size * sizeof (struct mapping));
292
293   ht->count = 0;
294
295   return ht;
296 }
297
298 /* Free the data associated with hash table HT. */
299
300 void
301 hash_table_destroy (struct hash_table *ht)
302 {
303   xfree (ht->mappings);
304   xfree (ht);
305 }
306
307 /* The heart of most functions in this file -- find the mapping whose
308    KEY is equal to key, using linear probing.  Returns the mapping
309    that matches KEY, or the first empty mapping if none matches.  */
310
311 static inline struct mapping *
312 find_mapping (const struct hash_table *ht, const void *key)
313 {
314   struct mapping *mappings = ht->mappings;
315   int size = ht->size;
316   struct mapping *mp = mappings + HASH_POSITION (ht, key);
317   int (*equals) PARAMS ((const void *, const void *)) = ht->test_function;
318
319   LOOP_NON_EMPTY (mp, mappings, size)
320     if (equals (key, mp->key))
321       break;
322   return mp;
323 }
324
325 /* Get the value that corresponds to the key KEY in the hash table HT.
326    If no value is found, return NULL.  Note that NULL is a legal value
327    for value; if you are storing NULLs in your hash table, you can use
328    hash_table_contains to be sure that a (possibly NULL) value exists
329    in the table.  Or, you can use hash_table_get_pair instead of this
330    function.  */
331
332 void *
333 hash_table_get (const struct hash_table *ht, const void *key)
334 {
335   struct mapping *mp = find_mapping (ht, key);
336   if (NON_EMPTY (mp))
337     return mp->value;
338   else
339     return NULL;
340 }
341
342 /* Like hash_table_get, but writes out the pointers to both key and
343    value.  Returns non-zero on success.  */
344
345 int
346 hash_table_get_pair (const struct hash_table *ht, const void *lookup_key,
347                      void *orig_key, void *value)
348 {
349   struct mapping *mp = find_mapping (ht, lookup_key);
350   if (NON_EMPTY (mp))
351     {
352       if (orig_key)
353         *(void **)orig_key = mp->key;
354       if (value)
355         *(void **)value = mp->value;
356       return 1;
357     }
358   else
359     return 0;
360 }
361
362 /* Return 1 if HT contains KEY, 0 otherwise. */
363
364 int
365 hash_table_contains (const struct hash_table *ht, const void *key)
366 {
367   struct mapping *mp = find_mapping (ht, key);
368   return NON_EMPTY (mp);
369 }
370
371 /* Grow hash table HT as necessary, and rehash all the key-value
372    mappings.  */
373
374 static void
375 grow_hash_table (struct hash_table *ht)
376 {
377   struct mapping *old_mappings = ht->mappings;
378   struct mapping *old_end      = ht->mappings + ht->size;
379   struct mapping *mp, *mappings;
380   int newsize;
381
382   newsize = prime_size (ht->size * HASH_RESIZE_FACTOR, &ht->prime_offset);
383 #if 0
384   printf ("growing from %d to %d; fullness %.2f%% to %.2f%%\n",
385           ht->size, newsize,
386           100.0 * ht->count / ht->size,
387           100.0 * ht->count / newsize);
388 #endif
389
390   ht->size = newsize;
391   ht->resize_threshold = newsize * HASH_MAX_FULLNESS;
392
393   mappings = xnew_array (struct mapping, newsize);
394   memset (mappings, 255, newsize * sizeof (struct mapping));
395   ht->mappings = mappings;
396
397   for (mp = old_mappings; mp < old_end; mp++)
398     if (NON_EMPTY (mp))
399       {
400         struct mapping *new_mp = mappings + HASH_POSITION (ht, mp->key);
401         /* We don't need to test for uniqueness of keys because they
402            come from the hash table and are therefore known to be
403            unique.  */
404         LOOP_NON_EMPTY (new_mp, mappings, newsize)
405           ;
406         *new_mp = *mp;
407       }
408
409   xfree (old_mappings);
410 }
411
412 /* Put VALUE in the hash table HT under the key KEY.  This regrows the
413    table if necessary.  */
414
415 void
416 hash_table_put (struct hash_table *ht, const void *key, void *value)
417 {
418   struct mapping *mp = find_mapping (ht, key);
419   if (NON_EMPTY (mp))
420     {
421       /* update existing item */
422       mp->key   = (void *)key; /* const? */
423       mp->value = value;
424       return;
425     }
426
427   /* If adding the item would make the table exceed max. fullness,
428      grow the table first.  */
429   if (ht->count >= ht->resize_threshold)
430     {
431       grow_hash_table (ht);
432       mp = find_mapping (ht, key);
433     }
434
435   /* add new item */
436   ++ht->count;
437   mp->key   = (void *)key;      /* const? */
438   mp->value = value;
439 }
440
441 /* Remove a mapping that matches KEY from HT.  Return 0 if there was
442    no such entry; return 1 if an entry was removed.  */
443
444 int
445 hash_table_remove (struct hash_table *ht, const void *key)
446 {
447   struct mapping *mp = find_mapping (ht, key);
448   if (!NON_EMPTY (mp))
449     return 0;
450   else
451     {
452       int size = ht->size;
453       struct mapping *mappings = ht->mappings;
454
455       mp->key = NULL;
456       --ht->count;
457
458       /* Rehash all the entries following MP.  The alternative
459          approach is to mark the entry as deleted, i.e. create a
460          "tombstone".  That makes remove faster, but leaves a lot of
461          garbage and slows down hash_table_get and hash_table_put.  */
462
463       mp = NEXT_MAPPING (mp, mappings, size);
464       LOOP_NON_EMPTY (mp, mappings, size)
465         {
466           const void *key2 = mp->key;
467           struct mapping *mp_new = mappings + HASH_POSITION (ht, key2);
468
469           /* Find the new location for the key. */
470
471           LOOP_NON_EMPTY (mp_new, mappings, size)
472             if (key2 == mp_new->key)
473               /* The mapping MP (key2) is already where we want it (in
474                  MP_NEW's "chain" of keys.)  */
475               goto next_rehash;
476
477           *mp_new = *mp;
478           mp->key = NULL;
479
480         next_rehash:
481           ;
482         }
483       return 1;
484     }
485 }
486
487 /* Clear HT of all entries.  After calling this function, the count
488    and the fullness of the hash table will be zero.  The size will
489    remain unchanged.  */
490
491 void
492 hash_table_clear (struct hash_table *ht)
493 {
494   memset (ht->mappings, '\0', ht->size * sizeof (struct mapping));
495   ht->count = 0;
496 }
497
498 /* Map MAPFUN over all the mappings in hash table HT.  MAPFUN is
499    called with three arguments: the key, the value, and MAPARG.
500
501    It is undefined what happens if you add or remove entries in the
502    hash table while hash_table_map is running.  The exception is the
503    entry you're currently mapping over; you may remove or change that
504    entry.  */
505
506 void
507 hash_table_map (struct hash_table *ht,
508                 int (*mapfun) (void *, void *, void *),
509                 void *maparg)
510 {
511   struct mapping *mp  = ht->mappings;
512   struct mapping *end = ht->mappings + ht->size;
513
514   for (; mp < end; mp++)
515     if (NON_EMPTY (mp))
516       {
517         void *key;
518       repeat:
519         key = mp->key;
520         if (mapfun (key, mp->value, maparg))
521           return;
522         /* hash_table_remove might have moved the adjacent
523            mappings. */
524         if (mp->key != key && NON_EMPTY (mp))
525           goto repeat;
526       }
527 }
528
529 /* Return the number of elements in the hash table.  This is not the
530    same as the physical size of the hash table, which is always
531    greater than the number of elements.  */
532
533 int
534 hash_table_count (const struct hash_table *ht)
535 {
536   return ht->count;
537 }
538 \f
539 /* Functions from this point onward are meant for convenience and
540    don't strictly belong to this file.  However, this is as good a
541    place for them as any.  */
542
543 /*
544  * Support for hash tables whose keys are strings.
545  *
546  */
547    
548 /* 31 bit hash function.  Taken from Gnome's glib, modified to use
549    standard C types.
550
551    We used to use the popular hash function from the Dragon Book, but
552    this one seems to perform much better.  */
553
554 unsigned long
555 string_hash (const void *key)
556 {
557   const char *p = key;
558   unsigned int h = *p;
559   
560   if (h)
561     for (p += 1; *p != '\0'; p++)
562       h = (h << 5) - h + *p;
563   
564   return h;
565 }
566
567 /* Frontend for strcmp usable for hash tables. */
568
569 int
570 string_cmp (const void *s1, const void *s2)
571 {
572   return !strcmp ((const char *)s1, (const char *)s2);
573 }
574
575 /* Return a hash table of preallocated to store at least ITEMS items
576    suitable to use strings as keys.  */
577
578 struct hash_table *
579 make_string_hash_table (int items)
580 {
581   return hash_table_new (items, string_hash, string_cmp);
582 }
583
584 /*
585  * Support for hash tables whose keys are strings, but which are
586  * compared case-insensitively.
587  *
588  */
589
590 /* Like string_hash, but produce the same hash regardless of the case. */
591
592 static unsigned long
593 string_hash_nocase (const void *key)
594 {
595   const char *p = key;
596   unsigned int h = TOLOWER (*p);
597   
598   if (h)
599     for (p += 1; *p != '\0'; p++)
600       h = (h << 5) - h + TOLOWER (*p);
601   
602   return h;
603 }
604
605 /* Like string_cmp, but doing case-insensitive compareison. */
606
607 static int
608 string_cmp_nocase (const void *s1, const void *s2)
609 {
610   return !strcasecmp ((const char *)s1, (const char *)s2);
611 }
612
613 /* Like make_string_hash_table, but uses string_hash_nocase and
614    string_cmp_nocase.  */
615
616 struct hash_table *
617 make_nocase_string_hash_table (int items)
618 {
619   return hash_table_new (items, string_hash_nocase, string_cmp_nocase);
620 }
621
622 /* Hashing of pointers.  Used for hash tables that are keyed by
623    pointer identity.  (Common Lisp calls them EQ hash tables, and Java
624    calls them IdentityHashMaps.)  */
625
626 static unsigned long
627 ptrhash (const void *ptr)
628 {
629   unsigned long key = (unsigned long)ptr;
630   key += (key << 12);
631   key ^= (key >> 22);
632   key += (key << 4);
633   key ^= (key >> 9);
634   key += (key << 10);
635   key ^= (key >> 2);
636   key += (key << 7);
637   key ^= (key >> 12);
638 #if SIZEOF_LONG > 4
639   key += (key << 44);
640   key ^= (key >> 54);
641   key += (key << 36);
642   key ^= (key >> 41);
643   key += (key << 42);
644   key ^= (key >> 34);
645   key += (key << 39);
646   key ^= (key >> 44);
647 #endif
648   return key;
649 }
650
651 static int
652 ptrcmp (const void *ptr1, const void *ptr2)
653 {
654   return ptr1 == ptr2;
655 }
656 \f
657 #ifdef STANDALONE
658
659 #include <stdio.h>
660 #include <string.h>
661
662 int
663 print_hash_table_mapper (void *key, void *value, void *count)
664 {
665   ++*(int *)count;
666   printf ("%s: %s\n", (const char *)key, (char *)value);
667   return 0;
668 }
669
670 void
671 print_hash (struct hash_table *sht)
672 {
673   int debug_count = 0;
674   hash_table_map (sht, print_hash_table_mapper, &debug_count);
675   assert (debug_count == sht->count);
676 }
677
678 int
679 main (void)
680 {
681   struct hash_table *ht = make_string_hash_table (0);
682   char line[80];
683   while ((fgets (line, sizeof (line), stdin)))
684     {
685       int len = strlen (line);
686       if (len <= 1)
687         continue;
688       line[--len] = '\0';
689       if (!hash_table_contains (ht, line))
690         hash_table_put (ht, strdup (line), "here I am!");
691 #if 1
692       if (len % 5 == 0)
693         {
694           char *line_copy;
695           if (hash_table_get_pair (ht, line, &line_copy, NULL))
696             {
697               hash_table_remove (ht, line);
698               xfree (line_copy);
699             }
700         }
701 #endif
702     }
703 #if 0
704   print_hash (ht);
705 #endif
706 #if 1
707   printf ("%d %d\n", ht->count, ht->size);
708 #endif
709   return 0;
710 }
711 #endif