Actually, you have an array of fewer fixed quantities that either use the chain (the result is in a linked list) or probing (the worst example: if a hash (x) is running, try a hash (x) +1) in collisions. You take your uint32 and mod to the size of the bucket, the simplest case.
You can determine the load factor - as soon as you get to N% of the filled array, we say, we double the size of the array and rephrase everything into a new array. Say somewhere between 50% and 75% use.
Well, isn't it that expensive, you say? Well, not quite. Let them say that you double the size of the array every time. Thus, you add N elements, the last of which starts a copy. N is added to O (1), and then one O (N) copy. But wait-O (N) / N averages the value of O (1), so the amortized average cost of adding is still O (1), provided that your load factor is chosen wisely,
source share