Hash tables offer exceptional performance when not overly full.
This is the traditional dilemma of all array-based data structures:
Make the table too small, performance degrades and the table may overflow
Make the table too big, and memory gets wasted.
Rehashing or variable hashing attempts to circumvent this dilemma by expanding the hash table size whenever it gets too full.