The part where he chooses his inputs to hit worst case behavior in Python's hash function.
He doesn't. Inputs are:
M = (1 << 61) - 1 values = [i * M for i in range(1, n + 1)]
He doesn't. Inputs are:
which are effectively random from the hash function's point of view, especially with a randomized seed (the default on current versions).