The key phrase is open addressing. Instead of hashing the bucket array, all records are in one large array. When you add an element, if the space for it is already in use, you simply move around the array to find the free space.
As long as the array is maintained large enough than the number of records, and the hash function is well distributed, you can keep the average search time small. And having one array, you can get better performance - it looks more like a cache.
However, it still has the worst linear behavior if (say) all the key hashes have the same value, so it does not avoid this problem.
source share