Я не уверен, почему автоинкремент или последовательность недопустимы. Вы хотите, чтобы внутренний идентификатор не был "угадываемым"? Что, это похоже на номер счета, и вы не хотите, чтобы кто-то мог угадать действительный номер счета?
Ну, ладно, кроме уже упомянутых UUID, на ум приходят две очевидные возможности.
Используйте последовательность, затем сгенерируйте случайное число и создайте номер счета из комбинации двух, используя алгоритм так, чтобы два разных номера последовательности не могли дать одно и то же окончательное число. Например, простой алгоритм может быть следующим: взять следующий порядковый номер, умножить на 12345678, сгенерировать случайное число от 0 до 12345678-1 и сложить их вместе.
Иметь таблицу в базе данных с одной записью, которая содержит последний присвоенный номер. Каждый раз, когда вам нужен новый номер, заблокируйте эту запись, используйте предыдущее значение для создания следующего значения и обновите запись. Пока числа постоянно увеличиваются, у вас не будет дубликатов.
Если у вас есть какая-то схема, в которой в качестве идентификатора используется идентификатор сервера, я рекомендую вам не использовать этот идентификатор просто как число, хранящееся где-то в файле конфигурации. Сейчас я работаю над системой, в которой кому-то пришла в голову блестящая идея дать каждому серверу «идентификатор сервера», который встроен для записи идентификаторов, а идентификатор сервера - это небольшое целое число, которое присваивается вручную. Это не слишком сложно в производстве, где есть только 3 сервера. Но при разработке и тестировании, когда новые серверы постоянно включаются и выключаются, а тестовые конфигурационные файлы постоянно разбрасываются, администрирование становится проблемой. Я бы не стал использовать период идентификатора сервера, но если вы собираетесь его использовать, сделайте его автоматически назначенным каким-либо центральным сервером или извлеките его из IP-адреса или из-за чего-то более безопасного.