Other more complex searches can be done with hashing as well. For example if there are several keys that might be used to access an item then hash all the possible keys into several places in the table. When you do the search, do it so that any key that matches will get you the item. Usually one wants a pointer hash table instead of an element table since an element can occur in more than one place. Pointer hash tables for complex hash searches like this usually conserve space.
To separate wheat from chaff, that is, searching for some small fraction of keys in a large noisy universe, can be done effectively by having a moderate sized bit hash table. A bit hash table has one bit per bin. The bit table has a one if the key might be something you want. If it is zero you know you don't want it. Having a low density of bits means that most of the time you see a zero bit. A zero bit means discard the current key immediately. Since most keys are chaff, this is highly efficient. Only when it is one and a possible hit do you look to see if it is the key you want.
Another way to use bit hash tables is do multiple independent hashes
into the table.
If all the independent hashes match the ones in the table
then the key exists.
Thus you never need to store the key at all this way.
The more one bits you use the more sure of the key you are.
To get additional independent hashes from a single hash computation,
just exclusive-or a fixed independent random integer with the hash
base number and recompute the mod to reduce it to the table size for
each independent hash you want.