3 * Copyright (C) 1997 Kaz Kylheku <kaz@ashi.footprints.net>
5 * Free Software License:
7 * All rights are reserved by the author, with the following exceptions:
8 * Permission is granted to freely reproduce and distribute this software,
9 * possibly in exchange for a fee, provided that this copyright notice appears
10 * intact. Permission is also granted to adapt this software to produce
11 * derivative works, as long as the modified versions carry this copyright
12 * notice and additional notices stating that the work has been modified.
13 * This source code may be translated into executable form and incorporated
14 * into proprietary software; there is no requirement for such software to
15 * contain a copyright notice related to this source.
17 * $Id: hash.c,v 1.36.2.11 2000/11/13 01:36:45 kaz Exp $
18 * $Name: kazlib_1_20 $
20 * 2008-04-17 Small modifications to build with stricter warnings
21 * David Lutterkort <dlutter@redhat.com>
31 #define HASH_IMPLEMENTATION
35 #ifdef HASH_DEBUG_VERIFY
36 # define expensive_assert(expr) assert (expr)
38 # define expensive_assert(expr) /* empty */
42 static const char rcsid[] = "$Id: hash.c,v 1.36.2.11 2000/11/13 01:36:45 kaz Exp $";
46 #define INIT_SIZE (1UL << (INIT_BITS)) /* must be power of two */
47 #define INIT_MASK ((INIT_SIZE) - 1)
49 #define next hash_next
51 #define data hash_data
52 #define hkey hash_hkey
54 #define table hash_table
55 #define nchains hash_nchains
56 #define nodecount hash_nodecount
57 #define maxcount hash_maxcount
58 #define highmark hash_highmark
59 #define lowmark hash_lowmark
60 #define compare hash_compare
61 #define function hash_function
62 #define allocnode hash_allocnode
63 #define freenode hash_freenode
64 #define context hash_context
65 #define mask hash_mask
66 #define dynamic hash_dynamic
68 #define table hash_table
69 #define chain hash_chain
71 static hnode_t *hnode_alloc(void *context);
72 static void hnode_free(hnode_t *node, void *context);
73 static hash_val_t hash_fun_default(const void *key);
74 static int hash_comp_default(const void *key1, const void *key2);
79 * Compute the number of bits in the hash_val_t type. We know that hash_val_t
80 * is an unsigned integral type. Thus the highest value it can hold is a
81 * Mersenne number (power of two, less one). We initialize a hash_val_t
82 * object with this value and then shift bits out one by one while counting.
84 * 1. HASH_VAL_T_MAX is a Mersenne number---one that is one less than a power
85 * of two. This means that its binary representation consists of all one
86 * bits, and hence ``val'' is initialized to all one bits.
87 * 2. While bits remain in val, we increment the bit count and shift it to the
88 * right, replacing the topmost bit by zero.
91 static void compute_bits(void)
93 hash_val_t val = HASH_VAL_T_MAX; /* 1 */
101 hash_val_t_bit = bits;
105 * Verify whether the given argument is a power of two.
108 static int is_power_of_two(hash_val_t arg)
112 while ((arg & 1) == 0)
118 * Compute a shift amount from a given table size
121 static hash_val_t compute_mask(hashcount_t size)
123 assert (is_power_of_two(size));
130 * Initialize the table of pointers to null.
133 static void clear_table(hash_t *hash)
137 for (i = 0; i < hash->nchains; i++)
138 hash->table[i] = NULL;
142 * Double the size of a dynamic table. This works as follows. Each chain splits
143 * into two adjacent chains. The shift amount increases by one, exposing an
144 * additional bit of each hashed key. For each node in the original chain, the
145 * value of this newly exposed bit will decide which of the two new chains will
146 * receive the node: if the bit is 1, the chain with the higher index will have
147 * the node, otherwise the lower chain will receive the node. In this manner,
148 * the hash table will continue to function exactly as before without having to
149 * rehash any of the keys.
152 * 2. The new number of chains is twice the old number of chains.
153 * 3. The new mask is one bit wider than the previous, revealing a
154 * new bit in all hashed keys.
155 * 4. Allocate a new table of chain pointers that is twice as large as the
157 * 5. If the reallocation was successful, we perform the rest of the growth
158 * algorithm, otherwise we do nothing.
159 * 6. The exposed_bit variable holds a mask with which each hashed key can be
160 * AND-ed to test the value of its newly exposed bit.
161 * 7. Now loop over each chain in the table and sort its nodes into two
162 * chains based on the value of each node's newly exposed hash bit.
163 * 8. The low chain replaces the current chain. The high chain goes
164 * into the corresponding sister chain in the upper half of the table.
165 * 9. We have finished dealing with the chains and nodes. We now update
166 * the various bookeeping fields of the hash structure.
169 static void grow_table(hash_t *hash)
173 assert (2 * hash->nchains > hash->nchains); /* 1 */
175 newtable = realloc(hash->table,
176 sizeof *newtable * hash->nchains * 2); /* 4 */
178 if (newtable) { /* 5 */
179 hash_val_t mask = (hash->mask << 1) | 1; /* 3 */
180 hash_val_t exposed_bit = mask ^ hash->mask; /* 6 */
183 assert (mask != hash->mask);
185 for (chain = 0; chain < hash->nchains; chain++) { /* 7 */
186 hnode_t *low_chain = 0, *high_chain = 0, *hptr, *next;
188 for (hptr = newtable[chain]; hptr != 0; hptr = next) {
191 if (hptr->hkey & exposed_bit) {
192 hptr->next = high_chain;
195 hptr->next = low_chain;
200 newtable[chain] = low_chain; /* 8 */
201 newtable[chain + hash->nchains] = high_chain;
204 hash->table = newtable; /* 9 */
210 expensive_assert (hash_verify(hash));
214 * Cut a table size in half. This is done by folding together adjacent chains
215 * and populating the lower half of the table with these chains. The chains are
216 * simply spliced together. Once this is done, the whole table is reallocated
217 * to a smaller object.
219 * 1. It is illegal to have a hash table with one slot. This would mean that
220 * hash->shift is equal to hash_val_t_bit, an illegal shift value.
221 * Also, other things could go wrong, such as hash->lowmark becoming zero.
222 * 2. Looping over each pair of sister chains, the low_chain is set to
223 * point to the head node of the chain in the lower half of the table,
224 * and high_chain points to the head node of the sister in the upper half.
225 * 3. The intent here is to compute a pointer to the last node of the
226 * lower chain into the low_tail variable. If this chain is empty,
227 * low_tail ends up with a null value.
228 * 4. If the lower chain is not empty, we simply tack the upper chain onto it.
229 * If the upper chain is a null pointer, nothing happens.
230 * 5. Otherwise if the lower chain is empty but the upper one is not,
231 * If the low chain is empty, but the high chain is not, then the
232 * high chain is simply transferred to the lower half of the table.
233 * 6. Otherwise if both chains are empty, there is nothing to do.
234 * 7. All the chain pointers are in the lower half of the table now, so
235 * we reallocate it to a smaller object. This, of course, invalidates
236 * all pointer-to-pointers which reference into the table from the
237 * first node of each chain.
238 * 8. Though it's unlikely, the reallocation may fail. In this case we
239 * pretend that the table _was_ reallocated to a smaller object.
240 * 9. Finally, update the various table parameters to reflect the new size.
243 static void shrink_table(hash_t *hash)
245 hash_val_t chain, nchains;
246 hnode_t **newtable, *low_tail, *low_chain, *high_chain;
248 assert (hash->nchains >= 2); /* 1 */
249 nchains = hash->nchains / 2;
251 for (chain = 0; chain < nchains; chain++) {
252 low_chain = hash->table[chain]; /* 2 */
253 high_chain = hash->table[chain + nchains];
254 for (low_tail = low_chain; low_tail && low_tail->next; low_tail = low_tail->next)
256 if (low_chain != 0) /* 4 */
257 low_tail->next = high_chain;
258 else if (high_chain != 0) /* 5 */
259 hash->table[chain] = high_chain;
261 assert (hash->table[chain] == NULL); /* 6 */
263 newtable = realloc(hash->table,
264 sizeof *newtable * nchains); /* 7 */
265 if (newtable) /* 8 */
266 hash->table = newtable;
267 hash->mask >>= 1; /* 9 */
268 hash->nchains = nchains;
271 expensive_assert (hash_verify(hash));
276 * Create a dynamic hash table. Both the hash table structure and the table
277 * itself are dynamically allocated. Furthermore, the table is extendible in
278 * that it will automatically grow as its load factor increases beyond a
281 * 1. If the number of bits in the hash_val_t type has not been computed yet,
282 * we do so here, because this is likely to be the first function that the
284 * 2. Allocate a hash table control structure.
285 * 3. If a hash table control structure is successfully allocated, we
286 * proceed to initialize it. Otherwise we return a null pointer.
287 * 4. We try to allocate the table of hash chains.
288 * 5. If we were able to allocate the hash chain table, we can finish
289 * initializing the hash structure and the table. Otherwise, we must
290 * backtrack by freeing the hash structure.
291 * 6. INIT_SIZE should be a power of two. The high and low marks are always set
292 * to be twice the table size and half the table size respectively. When the
293 * number of nodes in the table grows beyond the high size (beyond load
294 * factor 2), it will double in size to cut the load factor down to about
295 * about 1. If the table shrinks down to or beneath load factor 0.5,
296 * it will shrink, bringing the load up to about 1. However, the table
297 * will never shrink beneath INIT_SIZE even if it's emptied.
298 * 7. This indicates that the table is dynamically allocated and dynamically
299 * resized on the fly. A table that has this value set to zero is
300 * assumed to be statically allocated and will not be resized.
301 * 8. The table of chains must be properly reset to all null pointers.
304 hash_t *hash_create(hashcount_t maxcount, hash_comp_t compfun,
309 if (hash_val_t_bit == 0) /* 1 */
312 hash = malloc(sizeof *hash); /* 2 */
315 hash->table = malloc(sizeof *hash->table * INIT_SIZE); /* 4 */
316 if (hash->table) { /* 5 */
317 hash->nchains = INIT_SIZE; /* 6 */
318 hash->highmark = INIT_SIZE * 2;
319 hash->lowmark = INIT_SIZE / 2;
321 hash->maxcount = maxcount;
322 hash->compare = compfun ? compfun : hash_comp_default;
323 hash->function = hashfun ? hashfun : hash_fun_default;
324 hash->allocnode = hnode_alloc;
325 hash->freenode = hnode_free;
326 hash->context = NULL;
327 hash->mask = INIT_MASK;
328 hash->dynamic = 1; /* 7 */
329 clear_table(hash); /* 8 */
330 expensive_assert (hash_verify(hash));
340 * Select a different set of node allocator routines.
343 void hash_set_allocator(hash_t *hash, hnode_alloc_t al,
344 hnode_free_t fr, void *context)
346 assert (hash_count(hash) == 0);
348 hash->allocnode = al ? al : hnode_alloc;
349 hash->freenode = fr ? fr : hnode_free;
350 hash->context = context;
354 * Free every node in the hash using the hash->freenode() function pointer, and
355 * cause the hash to become empty.
358 void hash_free_nodes(hash_t *hash)
360 hnode_t *node, *next;
363 for (chain = 0; chain < hash->nchains; chain ++) {
364 node = hash->table[chain];
365 while (node != NULL) {
367 hash->freenode(node, hash->context);
370 hash->table[chain] = NULL;
377 * Obsolescent function for removing all nodes from a table,
378 * freeing them and then freeing the table all in one step.
381 void hash_free(hash_t *hash)
383 #ifdef KAZLIB_OBSOLESCENT_DEBUG
384 assert ("call to obsolescent function hash_free()" && 0);
386 hash_free_nodes(hash);
391 * Free a dynamic hash table structure.
394 void hash_destroy(hash_t *hash)
396 assert (hash_val_t_bit != 0);
397 assert (hash_isempty(hash));
403 * Initialize a user supplied hash structure. The user also supplies a table of
404 * chains which is assigned to the hash structure. The table is static---it
405 * will not grow or shrink.
406 * 1. See note 1. in hash_create().
407 * 2. The user supplied array of pointers hopefully contains nchains nodes.
408 * 3. See note 7. in hash_create().
409 * 4. We must dynamically compute the mask from the given power of two table
411 * 5. The user supplied table can't be assumed to contain null pointers,
412 * so we reset it here.
415 hash_t *hash_init(hash_t *hash, hashcount_t maxcount,
416 hash_comp_t compfun, hash_fun_t hashfun, hnode_t **table,
419 if (hash_val_t_bit == 0) /* 1 */
422 assert (is_power_of_two(nchains));
424 hash->table = table; /* 2 */
425 hash->nchains = nchains;
427 hash->maxcount = maxcount;
428 hash->compare = compfun ? compfun : hash_comp_default;
429 hash->function = hashfun ? hashfun : hash_fun_default;
430 hash->dynamic = 0; /* 3 */
431 hash->mask = compute_mask(nchains); /* 4 */
432 clear_table(hash); /* 5 */
434 expensive_assert (hash_verify(hash));
439 * Reset the hash scanner so that the next element retrieved by
440 * hash_scan_next() shall be the first element on the first non-empty chain.
442 * 1. Locate the first non empty chain.
443 * 2. If an empty chain is found, remember which one it is and set the next
444 * pointer to refer to its first element.
445 * 3. Otherwise if a chain is not found, set the next pointer to NULL
446 * so that hash_scan_next() shall indicate failure.
449 void hash_scan_begin(hscan_t *scan, hash_t *hash)
451 hash_val_t nchains = hash->nchains;
458 for (chain = 0; chain < nchains && hash->table[chain] == 0; chain++)
461 if (chain < nchains) { /* 2 */
463 scan->next = hash->table[chain];
470 * Retrieve the next node from the hash table, and update the pointer
471 * for the next invocation of hash_scan_next().
473 * 1. Remember the next pointer in a temporary value so that it can be
475 * 2. This assertion essentially checks whether the module has been properly
476 * initialized. The first point of interaction with the module should be
477 * either hash_create() or hash_init(), both of which set hash_val_t_bit to
479 * 3. If the next pointer we are returning is not NULL, then the user is
480 * allowed to call hash_scan_next() again. We prepare the new next pointer
481 * for that call right now. That way the user is allowed to delete the node
482 * we are about to return, since we will no longer be needing it to locate
484 * 4. If there is a next node in the chain (next->next), then that becomes the
485 * new next node, otherwise ...
486 * 5. We have exhausted the current chain, and must locate the next subsequent
487 * non-empty chain in the table.
488 * 6. If a non-empty chain is found, the first element of that chain becomes
489 * the new next node. Otherwise there is no new next node and we set the
490 * pointer to NULL so that the next time hash_scan_next() is called, a null
491 * pointer shall be immediately returned.
495 hnode_t *hash_scan_next(hscan_t *scan)
497 hnode_t *next = scan->next; /* 1 */
498 hash_t *hash = scan->table;
499 hash_val_t chain = scan->chain + 1;
500 hash_val_t nchains = hash->nchains;
502 assert (hash_val_t_bit != 0); /* 2 */
505 if (next->next) { /* 4 */
506 scan->next = next->next;
508 while (chain < nchains && hash->table[chain] == 0) /* 5 */
510 if (chain < nchains) { /* 6 */
512 scan->next = hash->table[chain];
522 * Insert a node into the hash table.
524 * 1. It's illegal to insert more than the maximum number of nodes. The client
525 * should verify that the hash table is not full before attempting an
527 * 2. The same key may not be inserted into a table twice.
528 * 3. If the table is dynamic and the load factor is already at >= 2,
530 * 4. We take the bottom N bits of the hash value to derive the chain index,
531 * where N is the base 2 logarithm of the size of the hash table.
534 void hash_insert(hash_t *hash, hnode_t *node, const void *key)
536 hash_val_t hkey, chain;
538 assert (hash_val_t_bit != 0);
539 assert (node->next == NULL);
540 assert (hash->nodecount < hash->maxcount); /* 1 */
541 expensive_assert (hash_lookup(hash, key) == NULL); /* 2 */
543 if (hash->dynamic && hash->nodecount >= hash->highmark) /* 3 */
546 hkey = hash->function(key);
547 chain = hkey & hash->mask; /* 4 */
551 node->next = hash->table[chain];
552 hash->table[chain] = node;
555 expensive_assert (hash_verify(hash));
559 * Find a node in the hash table and return a pointer to it.
561 * 1. We hash the key and keep the entire hash value. As an optimization, when
562 * we descend down the chain, we can compare hash values first and only if
563 * hash values match do we perform a full key comparison.
564 * 2. To locate the chain from among 2^N chains, we look at the lower N bits of
565 * the hash value by anding them with the current mask.
566 * 3. Looping through the chain, we compare the stored hash value inside each
567 * node against our computed hash. If they match, then we do a full
568 * comparison between the unhashed keys. If these match, we have located the
572 hnode_t *hash_lookup(hash_t *hash, const void *key)
574 hash_val_t hkey, chain;
577 hkey = hash->function(key); /* 1 */
578 chain = hkey & hash->mask; /* 2 */
580 for (nptr = hash->table[chain]; nptr; nptr = nptr->next) { /* 3 */
581 if (nptr->hkey == hkey && hash->compare(nptr->key, key) == 0)
589 * Delete the given node from the hash table. Since the chains
590 * are singly linked, we must locate the start of the node's chain
593 * 1. The node must belong to this hash table, and its key must not have
594 * been tampered with.
595 * 2. If this deletion will take the node count below the low mark, we
596 * shrink the table now.
597 * 3. Determine which chain the node belongs to, and fetch the pointer
598 * to the first node in this chain.
599 * 4. If the node being deleted is the first node in the chain, then
600 * simply update the chain head pointer.
601 * 5. Otherwise advance to the node's predecessor, and splice out
602 * by updating the predecessor's next pointer.
603 * 6. Indicate that the node is no longer in a hash table.
606 hnode_t *hash_delete(hash_t *hash, hnode_t *node)
611 expensive_assert (hash_lookup(hash, node->key) == node); /* 1 */
612 assert (hash_val_t_bit != 0);
614 if (hash->dynamic && hash->nodecount <= hash->lowmark
615 && hash->nodecount > INIT_SIZE)
616 shrink_table(hash); /* 2 */
618 chain = node->hkey & hash->mask; /* 3 */
619 hptr = hash->table[chain];
621 if (hptr == node) { /* 4 */
622 hash->table[chain] = node->next;
624 while (hptr->next != node) { /* 5 */
628 assert (hptr->next == node);
629 hptr->next = node->next;
633 expensive_assert (hash_verify(hash));
635 node->next = NULL; /* 6 */
639 int hash_alloc_insert(hash_t *hash, const void *key, void *data)
641 hnode_t *node = hash->allocnode(hash->context);
644 hnode_init(node, data);
645 hash_insert(hash, node, key);
651 void hash_delete_free(hash_t *hash, hnode_t *node)
653 hash_delete(hash, node);
654 hash->freenode(node, hash->context);
658 * Exactly like hash_delete, except does not trigger table shrinkage. This is to be
659 * used from within a hash table scan operation. See notes for hash_delete.
662 hnode_t *hash_scan_delete(hash_t *hash, hnode_t *node)
667 expensive_assert (hash_lookup(hash, node->key) == node);
668 assert (hash_val_t_bit != 0);
670 chain = node->hkey & hash->mask;
671 hptr = hash->table[chain];
674 hash->table[chain] = node->next;
676 while (hptr->next != node)
678 hptr->next = node->next;
682 expensive_assert (hash_verify(hash));
689 * Like hash_delete_free but based on hash_scan_delete.
692 void hash_scan_delfree(hash_t *hash, hnode_t *node)
694 hash_scan_delete(hash, node);
695 hash->freenode(node, hash->context);
699 * Verify whether the given object is a valid hash table. This means
701 * 1. If the hash table is dynamic, verify whether the high and
702 * low expansion/shrinkage thresholds are powers of two.
703 * 2. Count all nodes in the table, and test each hash value
704 * to see whether it is correct for the node's chain.
707 int hash_verify(hash_t *hash)
709 hashcount_t count = 0;
713 if (hash->dynamic) { /* 1 */
714 if (hash->lowmark >= hash->highmark)
716 if (!is_power_of_two(hash->highmark))
718 if (!is_power_of_two(hash->lowmark))
722 for (chain = 0; chain < hash->nchains; chain++) { /* 2 */
723 for (hptr = hash->table[chain]; hptr != 0; hptr = hptr->next) {
724 if ((hptr->hkey & hash->mask) != chain)
730 if (count != hash->nodecount)
737 * Test whether the hash table is full and return 1 if this is true,
742 int hash_isfull(hash_t *hash)
744 return hash->nodecount == hash->maxcount;
748 * Test whether the hash table is empty and return 1 if this is true,
753 int hash_isempty(hash_t *hash)
755 return hash->nodecount == 0;
758 static hnode_t *hnode_alloc(ATTRIBUTE_UNUSED void *context)
760 return malloc(sizeof *hnode_alloc(NULL));
763 static void hnode_free(hnode_t *node, ATTRIBUTE_UNUSED void *context)
770 * Create a hash table node dynamically and assign it the given data.
773 hnode_t *hnode_create(void *data)
775 hnode_t *node = malloc(sizeof *node);
784 * Initialize a client-supplied node
787 hnode_t *hnode_init(hnode_t *hnode, void *data)
795 * Destroy a dynamically allocated node.
798 void hnode_destroy(hnode_t *hnode)
804 void hnode_put(hnode_t *node, void *data)
810 void *hnode_get(hnode_t *node)
816 const void *hnode_getkey(hnode_t *node)
822 hashcount_t hash_count(hash_t *hash)
824 return hash->nodecount;
828 hashcount_t hash_size(hash_t *hash)
830 return hash->nchains;
833 static hash_val_t hash_fun_default(const void *key)
835 static unsigned long randbox[] = {
836 0x49848f1bU, 0xe6255dbaU, 0x36da5bdcU, 0x47bf94e9U,
837 0x8cbcce22U, 0x559fc06aU, 0xd268f536U, 0xe10af79aU,
838 0xc1af4d69U, 0x1d2917b5U, 0xec4c304dU, 0x9ee5016cU,
839 0x69232f74U, 0xfead7bb3U, 0xe9089ab6U, 0xf012f6aeU,
842 const unsigned char *str = key;
846 acc ^= randbox[(*str + acc) & 0xf];
847 acc = (acc << 1) | (acc >> 31);
849 acc ^= randbox[((*str++ >> 4) + acc) & 0xf];
850 acc = (acc << 2) | (acc >> 30);
856 static int hash_comp_default(const void *key1, const void *key2)
858 return strcmp(key1, key2);
861 #ifdef KAZLIB_TEST_MAIN
867 typedef char input_t[256];
869 static int tokenize(char *string, ...)
875 va_start(arglist, string);
876 tokptr = va_arg(arglist, char **);
878 while (*string && isspace((unsigned char) *string))
883 while (*string && !isspace((unsigned char) *string))
885 tokptr = va_arg(arglist, char **);
896 static char *dupstring(char *str)
898 int sz = strlen(str) + 1;
899 char *new = malloc(sz);
901 memcpy(new, str, sz);
905 static hnode_t *new_node(void *c)
907 static hnode_t few[5];
911 return few + count++;
916 static void del_node(hnode_t *n, void *c)
923 hash_t *h = hash_create(HASHCOUNT_T_MAX, 0, 0);
926 char *tok1, *tok2, *val;
931 "a <key> <val> add value to hash table\n"
932 "d <key> delete value from hash table\n"
933 "l <key> lookup value in hash table\n"
934 "n show size of hash table\n"
935 "c show number of entries\n"
936 "t dump whole hash table\n"
937 "+ increase hash table (private func)\n"
938 "- decrease hash table (private func)\n"
939 "b print hash_t_bit value\n"
941 "s switch to non-functioning allocator\n"
945 puts("hash_create failed");
952 if (!fgets(in, sizeof(input_t), stdin))
960 printf("%d\n", hash_val_t_bit);
963 if (tokenize(in+1, &tok1, &tok2, (char **) 0) != 2) {
967 key = dupstring(tok1);
968 val = dupstring(tok2);
971 puts("out of memory");
977 if (hash_alloc_insert(h, key, val) < 0) {
978 puts("hash_alloc_insert failed");
985 if (tokenize(in+1, &tok1, (char **) 0) != 1) {
989 hn = hash_lookup(h, tok1);
991 puts("hash_lookup failed");
995 key = hnode_getkey(hn);
996 hash_scan_delfree(h, hn);
1001 if (tokenize(in+1, &tok1, (char **) 0) != 1) {
1005 hn = hash_lookup(h, tok1);
1007 puts("hash_lookup failed");
1010 val = hnode_get(hn);
1014 printf("%lu\n", (unsigned long) hash_size(h));
1017 printf("%lu\n", (unsigned long) hash_count(h));
1020 hash_scan_begin(&hs, h);
1021 while ((hn = hash_scan_next(&hs)))
1022 printf("%s\t%s\n", (char*) hnode_getkey(hn),
1023 (char*) hnode_get(hn));
1026 grow_table(h); /* private function */
1029 shrink_table(h); /* private function */
1040 hash_set_allocator(h, new_node, del_node, NULL);