The idea is old: in a 1953 IBM memo Hans Peter Luhn proposed computing an item's address straight from its key — no searching, just arithmetic. Collisions are not a bug; by the pigeonhole principle any map from a huge key-space into a small array must sometimes send two keys to the same home.
Donald Knuth's analysis of linear probing (1963) is famous partly because it was so hard: primary clustering makes the average lookup grow like ½(1+1/(1−α)), going vertical as the load factor α nears 1.
A good hash function scatters keys evenly, which is why a raw k mod m with m a power of two — keeping only the low bits — is fragile, and why multiplication or a prime modulus behaves better against orderly or adversarial keys.
Real tables (Java's HashMap, Python's dict, Go's map) resize once α crosses a threshold near 0.75, doubling the array and rehashing. Bounding α is what keeps hashing's promise of amortized O(1).
Something in the simulation stopped unexpectedly — the lesson continues without it. You can move on; nothing you did was wrong.