Я чего думаю... Можно так сделать. Берем твой "вариант 2", только модифицируем его. Надо будет сделать скрипт, который запускается раз в день (месяц, неделю) или по необходимости.
1-й этап. Выбираем все незанятые числа, удовлетворяющие потребностям (например, твоё "как минимум трехзначное в 16-ой системе исчисления").
2-й этап. Перемешиваем их в произвольном порядке, и пишем в отдельную таблицу в БД. Получаем "псевдослучайную" последовательность чисел, не занятых другими людьми.
3-й этап. Когда есть потребность, достаем первое же число, и удаляем его из таблицы псевдослучайных. Один маленький запрос, выполнится очень быстро.
4-й этап. Если чисел становится слишком мало, то автоматически запускаем скрипт, который генерит эти числа.
Этапы 1-2 - это один несложный запрос
![smile.gif](http://phpforum.ru/html/emoticons/smile.gif)
И не важно, сколько времени он будет выполняться, потому что пользователь не будет ждать его.