Создать уникальное случайное целое число в столбце базы данных - PullRequest
5 голосов
/ 17 марта 2011

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

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

Ответы [ 2 ]

5 голосов
/ 17 марта 2011

Это даст вам случайное число до 12 цифр, с очень небольшим количеством коллизий.

select -convert(bigint, convert(varbinary(max), newid())) % 1000000000000

Вам нужно проверять и игнорировать коллизии, а также сбрасывать числа, число которых заканчивается менее чем на 6цифры.


РЕДАКТИРОВАТЬ

Чтобы сначала использовать самые низкие длины, вы не сможете использовать действительно генератор случайных чисел.Это потому, что как только вы достигнете 95% 6-значного диапазона, коллизии будут настолько велики, что программа будет тратить все свое время, пытаясь и пытаясь получить уникальный номер, который еще не использовался.Как только вы получите только один оставшийся номер, программа может ждать вечно и никогда не «сгенерировать» этот номер.Таким образом, чтобы выполнить «сначала наименьшую длину», вам на самом деле нужно сгенерировать ВСЕ числа в таблицу, а затем случайным образом (order by len(num), newid()) их номер, а затем последовательно вытянуть их.

Чтобы от 0 до 12цифры, используйте

select right('000000000000'
      +right(-convert(bigint, convert(varbinary(max), newid())),12),12)
2 голосов
/ 17 марта 2011

Может показаться неубедительным, но в зависимости от количества значений, которые вам понадобятся, вы можете просто наложить уникальное ограничение на столбец и обновить каждую строку случайным числом (с 6-12 цифрами) и цикл пока не подведет. 12 цифр - это много значений, поэтому вы, вероятно, не получите много коллизий.

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