Лучший подход зависит от тонкого аспекта требования к случайности вашего клиента - когда они говорят, случайный , они означают, что они абсолютно непредсказуемы или просто трудно предсказать?Я не хочу походить на Клинтона на суде Левински, но то, что ваш клиент собирается, когда он скажет random , влияет на то, удастся ли вам даже выполнить требование.
Есликлиент хочет скрыть идентификаторы пользователей (для некоторого предполагаемого преимущества безопасности) и сделать их практически невозможными для прогнозирования или обратного инжиниринга, тогда это очень сложно.Если клиенту будет достаточно просто «трудно» предсказать (что я подозреваю), то вы можете сделать что-то простое, похожее на подход md5 (@Dotty).Но md5 не устойчив к столкновениям .И даже с лучшими, доказуемо уникальными хеш-алгоритмами (которых нет в md5), у вас возникнет проблема коллизий, если количество пользователей велико по сравнению с количеством цифр, которые вы можете использовать для идентификаторов пользователей (8).У вас есть около 27 бит для работы с разрешенными 8 десятичными цифрами.Это означает, что вы, вероятно, получите столкновение после 2 ^ N / 2 = 2 ^ (27/2), что составляет около 10 000 пользователей.Таким образом, если список пользователей вашего клиента приближается к 10 000 пользователей, то даже самый лучший алгоритм хэширования потратит много времени на фильтрацию всех коллизий.Чтобы решить эту проблему без фильтров и недетерминированных алгоритмов, просто используйте простой алгоритм " Full Cycle ".Некоторые из них будут производить псевдослучайные числа (PRN), которые гарантированно будут уникальными и будут полностью охватывать любой диапазон, который вы пытаетесь охватить (например, набор всех 8-значных натуральных чисел).И если вам когда-либо понадобится провести обратный инжиниринг последовательности регистрации пользователей, просто перезапустите генератор PRN полного цикла с любым начальным значением, которое вы использовали.И вы можете сохранить это начальное значение в секрете, например, в виде закрытого ключа, если ваш клиент хочет, чтобы хакеру было немного сложнее, чем просто хакеру, перепроектировать вашу последовательность идентификаторов пользователей.
Другой вопрос для вашего клиентаразрешены ли начальные нули в идентификаторе пользователя.Если это так (и требования к случайности клиента либеральны), то простой алгоритм Full Cycle в Википедии будет работать для вас.Это может быть перегнано до 2 строк PHP.Какой бы алгоритм вы ни использовали, было бы неплохо сгенерировать список официальных 8-значных полуслучайных идентификаторов пользователя в отдельной таблице, а затем просто «вытолкнуть» значение из верхней части таблицы (удалив эту строку) всякий раз, когда выдобавить нового пользователяТребования к памяти базы данных не должны быть чрезмерными, и это упростит взаимодействие с пользователем, устраняя любые задержки и сбои памяти, вызванные сложными, недетерминированными генераторами случайных чисел и фильтрами уникальности.Пытаясь создать идентификатор пользователя онлайн, вживую, возможно, вы могли бы попасть в вечный цикл с некоторыми алгоритмами хэширования, которые задерживают вашу регистрацию пользователя на неопределенное время.И эта остановка (из-за постоянной коллизии) может не произойти до 1000 или 10000 пользователей. Напротив, с подходом автономной таблицы поиска вы можете легко добавить дополнительные предписанные клиентом фильтры, такие как удаление идентификаторов с ведущими нулями;в случае, если клиент никогда не хочет видеть пользователя с идентификатором 1 (00000001).И вы бы заранее знали, будет ли все работать всегда, без каких-либо зависаний.