Usually (as in C++), the hash function returns any size_t value -- thus many different hash values are possible (2^32).
That is why I always thought that when people talked about them being implemented as tables, that is not really true in practice because the table would be much too big (2^32 entries). Of course my assumption was wrong that the table must be as big as the full range of hash values.
It seems that the actual implementation is more difficult than I thought. What I always had in mind, what would be the naive implementation, is something like:
typedef list< pair<Key,Value> > Bucket;
typedef map< size_t, Bucket > Hashtable;
Now my question: How does this naive implementation differs from actual implementations in the praxis in terms of complexity (runtime and memory)?