У меня есть запрос как часть приложения, над которым я работаю, на создание UserId со следующими критериями:

  1. Он будет иметь префикс из 4 цифр.
  2. Следующие 10 цифр будут случайными
  3. Контрольная цифра будет добавлена ​​в конце

Пункты 1 и 3 просты, но как лучше всего сгенерировать 10-значное случайное число, гарантируя, что оно еще не использовалось.

Мне не особенно нравится идея выбрать один случайным образом, посмотреть, был ли он принят, а затем либо принять, либо попробовать снова.

Другой моей мыслью было заранее сгенерировать список из X номеров (X - это число, большее, чем количество учетных записей, которые вы ожидаете создать) и просто убрать следующую из списка по мере создания учетных записей.

Любые мысли?

EDIT: давайте внесем в это технологию. Если я использую базу данных SQL-сервера, могу ли я заставить базу данных делать это за меня? Например. применить уникальное ограничение и заставить базу данных сгенерировать номер?

1
Neil 16 Окт 2015 в 11:08

3 ответа

Лучший ответ

Шифрование. См. этот ответ.

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

Что особенно хорошо в этом, так это то, что вы можете делать все это на стороне клиента, хотя и за две последовательные транзакции.

2
Community 23 Май 2017 в 11:44

Благодаря ответу Антона я нашел эту реализацию C # алгоритма шифрования skip32.

https://github.com/eleven41/Eleven41.Skip32

Используя это, я могу передать увеличивающееся целое число идентификатора базы данных и получить из него красивое случайное 9/10-значное число. Итак, простой вызов вроде

int result = cipher.Encrypt(databaseIdentity);

Даст мне номер, который я хочу. Нет необходимости в повторной проверке, так как каждый будет уникальным.

0
Neil 18 Окт 2015 в 16:36

Единственный способ быть на 100% уверенным, что нет другого идентификатора пользователя с такими же случайными цифрами, - это сравнить созданный со всеми существующими пользователями, вы должны сделать это когда-нибудь

Единственная возможность - сделать это на стороне кода.

НО вы можете сохранить случайно сгенерированный идентификатор в базе данных пользователя и сравнить его с вашим новым ключом (в вашем коде)

Например SELECT * FROM xy WHERE userid = 'newuserid'

Если результат равен нулю, ваш ключ никогда не создавался.

0
Sebastian Schneider 16 Окт 2015 в 08:23