Генерация уникальных номеров аккаунта - рекурсивный вызов

Попробуйте поместить это в ваш файл .htaccess:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^sub.domain.com
RewriteRule ^(.*)$ http://domain.com/subdomains/sub/$1 [L,NC,QSA]

Для более общего правила (которое работает с любым поддоменом, а не только sub) замените последние две строки на это:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.domain\.com
RewriteRule ^(.*)$ http://domain.com/subdomains/%1/$1 [L,NC,QSA]
5
задан 19 September 2008 в 00:59
поделиться

10 ответов

Вы понимаете, что это могло очень хорошо вызвать переполнение стека, правильно? Как количество увеличений customesr, вероятность не нахождения увеличивается приемлемый номер аккаунта.

Кроме того, почему Вы не можете только сделать последовательных номеров аккаунта и просто увеличиться к одному каждому разу? С этим подходом необходимо было бы просто в настоящее время читать макс. идентификатор в базе данных и просто увеличивать его.

Извините, что был таким образом тупой, но Вашим решением является ужасный способ заняться проблемой. Это будет использовать тонны памяти (поскольку стек возможно растет бесконечно), и это будет делать тонны дорогих вызовов к базе данных.

Необходимо действительно рассмотреть некоторый другой подход:
Я настоятельно рекомендую просто увеличить клиентское число каждый раз, когда Вы создаете клиента. На самом деле при установке дб правильно (с автоматическим инкрементом на идентификационном столбце), Вы не должны будете даже устанавливать идентификатор. Идентификатор будет установлен для Вас каждый раз, когда Вы вводите нового клиента.

8
ответ дан 18 December 2019 в 10:50
поделиться

Я действительно не думаю, что это сводится к рекурсии по сравнению с цикличным выполнением, оба подвержены проблемам, когда набор данных растет и если генерация случайных чисел правильно не реализована. Две идеи приходят на ум:

. GUID

Если действительно уникальный идентификатор будет требоваться с как можно меньшим усилием, рассмотрите GUID, то Ваш DB, скорее всего, сможет присвоиться на для Вас на вставке, если не создадут один в коде. Это, как гарантируют, будет уникально, хотя это не очень удобно для пользователя. Однако в сочетании с последовательным AccountRecordId, сгенерированным DB на вставке, у Вас была бы твердая комбинация

. Составной ключ: случайный + последовательный

Один способ обратиться ко всем потребностям, хотя в поверхности это чувствует себя немного топорным, состоит в том, чтобы создать составной номер аккаунта из последовательного ключа дб 5 цифр (или больше) и затем еще 5 цифр случайности. Если бы случайное число было дублировано, то оно не имело бы значения, поскольку последовательный идентификатор гарантировал бы уникальность всего номера аккаунта

3
ответ дан 18 December 2019 в 10:50
поделиться

Нет никакой потребности использовать рекурсивный вызов здесь. Выполните простой цикл с условием продолжения в тестировании функции против несуществования как условное выражение, например.

function generateAccNo()

    generate an account number between 100,000,000 and 999,999,999

    while ( the account number already exists in the DB ) {
         generate new account number;
    }
    return new account number

end function

Случайным образом генерация-и-тестирование является субоптимальным подходом к генерации уникальных номеров аккаунта, тем не менее, если этот код для чего-нибудь кроме игрушки.

2
ответ дан 18 December 2019 в 10:50
поделиться

Это кажется прекрасным, но я думаю, что Вам нужен своего рода умирающего условие, сколько раз Вы собираетесь позволить этому выполнению перед отказом?

Я знаю, что это кажется маловероятным с огромным диапазоном числа, но что-то могло пойти не так, как надо, который просто роняет Вас к предыдущему вызову, который назовет себя снова, рекламу-nauseum.

1
ответ дан 18 December 2019 в 10:50
поделиться

Генерация номеров аккаунта последовательно является угрозой безопасности - необходимо найти, что некоторый другой алгоритм делает это.

1
ответ дан 18 December 2019 в 10:50
поделиться

Поочередно, можно поддержать отдельную таблицу, содержащую буфер сгенерированных, известных, чтобы быть уникальными номерами аккаунта. Эта таблица должна иметь автоувеличивающий целочисленный идентификатор. Когда Вы захотите номер аккаунта, просто вытяните запись с самым низким индексом в буфере и удалите его из той таблицы. Имейте некоторый процесс, который регулярно работает, который пополняет буфер и удостоверяется, что имеет способность>> нормальное использование. Преимущество состоит в том, что количество времени, испытанное конечным пользователем, потраченным, создавая номер аккаунта, будет чрезвычайно постоянным.

Кроме того, я должен отметить, что обработка наверху или риски рекурсии или повторения, реальной проблемой является детерминизм и издержки повторяющихся запросов базы данных. Я люблю решение TheZenker случайных + последовательный. Гарантируемый генерировать уникальный идентификатор, не добавляя ненужные издержки.

1
ответ дан 18 December 2019 в 10:50
поделиться

Вы могли вставить его некоторое время цикл:

function generateAccNo()

    while (true) {    

      generate an account number between 100,000,000 and 999,999,999

      if the account number already exists in the DB 
          /* do nothing */
      else
          return new accout number
      end if
    }

end function
0
ответ дан 18 December 2019 в 10:50
поделиться

Вы не должны использовать рекурсию здесь. Простой цикл был бы так же быстр и использовал бы меньше стекового пространства.

0
ответ дан 18 December 2019 в 10:50
поделиться

Почему нет:

lock_db
do
    account_num <= generate number
while account_num in db

put row with account_num in db

unlock_db
0
ответ дан 18 December 2019 в 10:50
поделиться

Почему бы не дескриптор базы данных это? В SQL Server у Вас может просто быть столбец идентификационных данных, который запускается по телефону 100000000. Или Вы могли использовать sql в любом дб, который Вы имеете. Просто получите макс. идентификатор плюс 1.

0
ответ дан 18 December 2019 в 10:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: