Генерация случайного уникального кода - PullRequest
8 голосов
/ 05 мая 2011

Мне нужно сгенерировать девятизначный числовой код (предпочтительно случайный), который является уникальным для данного дня (такое же число не может быть сгенерировано снова в тот же день).Я думал об использовании HHMMSSmmm (часы, минуты, секунды и миллисекунды) для генерации уникального кода, но на самом деле это не случайно.Доступ к этому методу генерации кода может осуществляться несколькими методами одновременно, поэтому мне придется заблокировать метод.Но будет ли это гарантировать, что число уникально, так как возможно, что генерация номера может занять менее миллисекунды, и два потока получат одно и то же число?

Есть ли лучший способ генерировать случайный уникальный числовой код, которыйуникален для данного дня?Количество цифр может быть от 6 до 9 цифр.

Редактировать: Количество генерируемых случайных чисел зависит от количества транзакций.Первоначально число может быть ниже, но в течение определенного периода времени оно может стать очень высоким (несколько транзакций в секунду).Следовательно, я не хотел бы сравнивать число с используемым списком, поскольку это может иметь проблемы с производительностью.

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

Генерация случайного числа должна выполняться в ASP.NET MVC.применение.

Ответы [ 13 ]

0 голосов
/ 05 мая 2011

Подходящий генератор кода зависит от того, сколько чисел должно быть сгенерировано за период.Рассмотрим следующие шаблоны:

ЧЧММСС + NNN - дает вам место для 999 случайных чисел в секунду.

ЧЧ + NNNNNNN - дает вам пространство для 9999999 случайных чисел в час.И т.д.

Если распределение вызовов метода генерации чисел во времени равномерно, то любой шаблон почти равен.

В любом случае, учитывая ограничение длины случайного числа, всегда существует ограничение на количество вызовов метода достолкновения начнутся.Например, если метод вызывается> 1000 раз в секунду.

0 голосов
/ 05 мая 2011

Используйте Guid.NewGuid (), чтобы получить что-то вроде:

0f8fad5b-d9cb-469f-a165-70867728950e

Затем избавьтесь от '-ов' и конвертируйте буквы в их аналоги ASCII. (где а = 97)

Затем конвертируйте в число.

0 голосов
/ 05 мая 2011

Добавьте идентификатор потока в конец кода, чтобы справиться с параллелизмом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...