-/* INTERFACE:
-
- Hash tables are an implementation technique used to implement
- mapping between objects. Provided a good hashing function is used,
- they guarantee constant-time access and storing of information.
- Duplicate keys are not allowed.
-
- The basics are all covered. hash_table_new creates a hash table,
- and hash_table_destroy deletes it. hash_table_put establishes a
- mapping between a key and a value. hash_table_get retrieves the
- value that corresponds to a key. hash_table_exists queries whether
- a key is stored in a table at all. hash_table_remove removes a
- mapping that corresponds to a key. hash_table_map allows you to
- map through all the entries in a hash table. hash_table_clear
- clears all the entries from the hash table.
-
- The number of mappings in a table is not limited, except by the
- amount of memory. As you add new elements to a table, it regrows
- as necessary. If you have an idea about how many elements you will
- store, you can provide a hint to hash_table_new().
-
- The hashing and equality functions are normally provided by the
- user. For the special (and frequent) case of hashing strings, you
- can use the pre-canned make_string_hash_table(), which provides the
- string hashing function from the Dragon Book, and a string equality
- wrapper around strcmp().
-
- When specifying your own hash and test functions, make sure the
- following holds true:
-
- - The test function returns non-zero for keys that are considered
- "equal", zero otherwise.
-
- - The hash function returns a number that represents the
- "distinctness" of the object. In more precise terms, it means
- that for any two objects that test "equal" under the test
- function, the hash function MUST produce the same result.
-
- This does not mean that each distinct object must produce a
- distinct value, only that non-distinct objects must produce the
- same values! For instance, a hash function that returns 0 for
- any given object is a perfectly valid (albeit extremely bad) hash
- function.