В базе данных или где-то ещё хранить последовательные целые ID, присваиваемые пользователям.
Остаётся сделать мэппинг из целых 0, 1, 2, ... в A00, A01, ... A99, B00, B01, ...
26 значений (A–Z), 10 значений (0–9), ещё 10 значений (0–9) – 2600 значений всего получится записать в три таких разряда. Вам этого точно достаточно?
<?php
function encode($n) {
if($n >= 2600 || $n<0) throw(new Exception('Out of range 0 <= n < 2600'));
return chr( 65 + floor( $n / 100)) . sprintf( '%02d', $n % 100);
}
echo encode(1654); // Q54
Проверяем, чтобы на вход пришло число не больше 2599 ("Z99") и не меньше 0.
Берём символ по его ASCII-коду функцией
chr(): А=65, B=66 ... Z=90. Чтобы получить из сотен нужный код, делим $n на 100 и округляем вниз. Получается от 0 до 25. Прибавив 65 получаются значения от 65 до 90 – как раз коды от A до Z.
Младшие два разряда, десятки и единицы, у числа сохраняются.