Если взять только нижний регистр, то получается 33^4 = 1185921
Я бы сгенерировать все варианты, и рандомом поудалял лишние, до 1000000.
А если нужнен и верхний, то прошелся по полученной выборке и тоже рандомом сделал бы преобразование в верхний. И никаких проверок на уникальность не надо.
Но вообще не понятно, зачем вам это писать на php, я бы сделал бы прямо на mysql:
хранимка:
BEGIN
SET @str = 'абвгдежзийклмнопрстуфхцчшщъыьэюя';
SET @a = 1;
WHILE @a < 33 DO
SET @b = 1;
WHILE @b < 33 DO
SET @c = 1;
WHILE @c < 33 DO
SET @d = 1;
WHILE @d < 33 DO
-- тут можно добавить случайное преобразование в верхний регистр
INSERT INTO test (word) VALUES(concat(
substr(@str, @a, 1),
substr(@str, @b, 1),
substr(@str, @c, 1),
substr(@str, @d, 1)));
SET @d = @d + 1;
END WHILE;
SET @c = @c + 1;
END WHILE;
SET @b = @b + 1;
END WHILE;
SET @a = @a + 1;
END WHILE;
Но вообще тоже не быстро. Может быть имеет смысл генерировать динамический sql и вставлять пакетами.
ну а дальше остаётся только удалить лишние:
DELETE t FROM test AS t
INNER JOIN (
SELECT word FROM test
ORDER BY RAND()
LIMIT 0, 48576
) AS q
ON q.word = t.word;