Это можно сделать разными способами, в зависимости от того, что вы пытаетесь оптимизировать (скорость, использование памяти и т. Д.).
Идентификационный номер = ддд с 1 с [0]
Вариант 1 (по сути, как хеширование, аналогично хэшированию Зака):
1 Создайте случайное число от 0 до количества возможностей (676k).
2- конвертировать число в комбинацию
ddd = random / (26^2)
c[0] = random % (26)
c[1] = (random / 26) % 26
3- Запросить БД на наличие идентификатора и приращения, пока не будет найден свободный.
Вариант 2 (регистр сдвига с линейной обратной связью, см. wikipedia ):
1- Семя со случайным числом в диапазоне (0,676k). (См. Ниже, почему вы не можете посеять с '0')
2. Создайте последующие случайные числа, применив следующее к текущему идентификационному номеру.
num = (num >> 1) ^ (-(num & 1u) & 0x90000u);
3- Пропустить идентификаторы, превышающие диапазон (т. Е. 0xA50A0 +)
4- Конвертируйте число в формат идентификатора (как указано выше)
* Вам нужно будет сохранить последнее сгенерированное число, использованное для идентификатора, но вам не нужно будет запрашивать БД, чтобы узнать, используется ли оно. Это решение будет перечислять все возможные идентификаторы, кроме [000 AA] из-за того, как работает LFSR.
[править] Так как ваш диапазон на самом деле больше, чем вам нужно, вы можете получить обратно [000 AA], вычтя 1, прежде чем преобразовать в идентификатор, и ваш допустимый диапазон будет (0,0xA50A0]