# 2.4.2.1 Types

typedef struct ZixHashImpl ZixHash

  A hash table.

  This is an open addressing hash table that stores pointers to arbitrary user data. Internally, everything is stored in a single flat array that is resized when necessary.

  The single user-provided pointer that is stored in the table is called a “record”. A record contains a “key”, which is accessed via a user-provided function. This design supports storing large records (which may be expensive to allocate/construct) without requiring an entire record to search. Simple atomic values can be stored by providing a trivial identity function as a key function.

  The table uses power of 2 sizes with a growth factor of 2, so that hash values can be folded into an array index using bitwise AND as a fast modulo. This means that only the necessary low bits of the hash value will be used, so the hash function must be well-balanced within this range. More or less any good modern hash algorithm will be fine, but beware, for example, hash functions that assume they are targeting a table with a prime size.

  Since this doubles and halves in size, it may not be an optimal choice if memory reuse is a priority. A growth factor of 1.5 with fast range reduction may be a better choice there, at the cost of requiring 128-bit arithmetic on 64-bit platforms, and indexing operations being slightly more expensive.

typedef size_t ZixHashCode

  A full hash code for a key which is not folded down to the table size.

typedef ZixHashCode (*ZixHashFunc)(const ZixHashKey *key)

  User function for computing the hash of a key.

typedef void ZixHashKey

  The type of a key within a record.

typedef void ZixHashRecord

  The type of a hash table record.

typedef void ZixHashSearchData

  User data for key comparison function.

typedef bool (*ZixKeyEqualFunc)(const ZixHashKey *a, const ZixHashKey *b)

  User function for determining if two keys are truly equal.

typedef const ZixHashKey *(*ZixKeyFunc)(const ZixHashRecord *record)

  User function for getting the key of a record.