You don't need random numbers at all. You want the exact numbers from 0 to N-1 in random order.
Simple array filling and shuffling should be very fast. A proper Fisher-Yates enumeration is O (n), so an array of 100 million should take up to a second in C or even Java, a bit slower in a higher-level language like Python.
You only need to create random N-1 numbers to perform shuffling (possibly up to 1.3N if you use sampling to get perfect uniformity), so the speed will depend largely on how fast your RNG is.
You will not need to search if a number has already been created; which will be deadly slow no matter which algorithm you use, especially towards the end of the run.
N , 0 N-1, . , "--check-for-dups". .