Всем привет.
Поиском пользовался, решения не нашёл
Допустим есть таблица с данными кодов пополнения (например prepaid для телефонов).
При добавлении записи в таблицу нужно генерировать уникальное число (допустим 12-значное), но что бы оно шло не по порядку и не повторялось уже в таблице.
Здравствуйте, -Cheese-, Вы писали:
C>Всем привет. C>Поиском пользовался, решения не нашёл C>Допустим есть таблица с данными кодов пополнения (например prepaid для телефонов). C>При добавлении записи в таблицу нужно генерировать уникальное число (допустим 12-значное), но что бы оно шло не по порядку и не повторялось уже в таблице.
Здравствуйте, Were, Вы писали:
C>>При добавлении записи в таблицу нужно генерировать уникальное число (допустим 12-значное), но что бы оно шло не по порядку и не повторялось уже в таблице.
W>Поле с типом uniqueidentifier не подходит?
Нужно именно число и именно 12-значное....
-Cheese- wrote:
> Поиском пользовался, решения не нашёл > Допустим есть таблица с данными кодов пополнения (например prepaid для > телефонов). > При добавлении записи в таблицу нужно генерировать уникальное число > (допустим 12-значное), но что бы оно шло не по порядку и не повторялось > уже в таблице.
С точки зрения безопасности самое надёжное — генерить число случайно (каким-нибудь "правильным" генератором случайных чисел) и держать таблицу уже сгенерённых, проверяя на дупликаты.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, -Cheese-, Вы писали:
C>Здравствуйте, Were, Вы писали:
C>>>При добавлении записи в таблицу нужно генерировать уникальное число (допустим 12-значное), но что бы оно шло не по порядку и не повторялось уже в таблице.
W>>Поле с типом uniqueidentifier не подходит? C>Нужно именно число и именно 12-значное....
А что uniqueidentifier уже не число?
Бери uniqueidentifier и соединяй куски XOR-ом.
Здравствуйте, -Cheese-, Вы писали:
C>Всем привет. C>Поиском пользовался, решения не нашёл C>Допустим есть таблица с данными кодов пополнения (например prepaid для телефонов). C>При добавлении записи в таблицу нужно генерировать уникальное число (допустим 12-значное), но что бы оно шло не по порядку и не повторялось уже в таблице.
Генерируй случайное, в таблице заведи unique constraint на это поле, при записи отлавливай constraint violation и перегенерируй до тех пор, пока не получится уникальное.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Генерируй случайное, в таблице заведи unique constraint на это поле, при записи отлавливай constraint violation и перегенерируй до тех пор, пока не получится уникальное.
В принципе я тоже так думал, но чем дальше — тем дольше это число будет генериться....
Здравствуйте, -Cheese-, Вы писали: C>В принципе я тоже так думал, но чем дальше — тем дольше это число будет генериться....
А ты посчитай характерное количество попыток в зависимости от количества записей. При условии, что всего 12-значных чисел — один триллион.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
_d_m_ wrote:
> W>>Поле с типом uniqueidentifier не подходит? > C>Нужно именно число и именно 12-значное.... > А что uniqueidentifier уже не число?
Оно 39-значное.
> Бери uniqueidentifier и соединяй куски XOR-ом.
А почему ты решил, что после соединения получится уникальное 12-значное?
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, -Cheese-, Вы писали: C>>В принципе я тоже так думал, но чем дальше — тем дольше это число будет генериться.... S>А ты посчитай характерное количество попыток в зависимости от количества записей. При условии, что всего 12-значных чисел — один триллион.
Только при 100.000 записей поподание в существующее число уже около 50%
Совершенно согласен с Mr.Cat, идея интересная и реализуемая но для извращенцев... однако есть и еще один вариантик, что если действительно генерить случайное число и проверять его на совпадения, и если не подходит не генерить новое а искать следующее не занатое, добавляя каждый раз по единице к случайно сгенерированному ранее числу.
Jyk wrote:
> количества записей. При условии, что всего 12-значных чисел — один триллион. > > Только при 100.000 записей поподание в существующее число уже около 50%
Это ты как посчитал? Чтобы было 50%, записей должно быть 500.000.000.000 (500млрд). А если человек делает это числа для каких-то там платежей, и если один платёж 1 руб, то даже если ему понадобится 1млрд случайных чисел, это значит он уже миллиардер.
А прибавлять единицу нельзя, это портит случайность (и не изменяет вероятность, тебе это только кажется, что изменяет). Нужно генерить ещё одно число.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, -Cheese-, Вы писали:
C>Всем привет. C>Поиском пользовался, решения не нашёл C>Допустим есть таблица с данными кодов пополнения (например prepaid для телефонов). C>При добавлении записи в таблицу нужно генерировать уникальное число (допустим 12-значное), но что бы оно шло не по порядку и не повторялось уже в таблице.
А зачем нужно генерировать именно 12-значное число, может GUID подойдет?
Необходима ли случайность, может даже IDENTITY подойдет?
Здравствуйте, Jyk, Вы писали: Jyk>Только при 100.000 записей поподание в существующее число уже около 50%
Это ты как посчитал? По формуле блондинки?
Вот у нас есть K=10^5 записей. Вероятность того, что число Q, случайно выбранное из N, совпадет с одним из K, равна K/N. Это 10^-7, что, мягко говоря, чуть меньше, чем 50 процентов.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, gandjustas, Вы писали:
G>А зачем нужно генерировать именно 12-значное число, может GUID подойдет? G>Необходима ли случайность, может даже IDENTITY подойдет?
К сожалению нужно именно 12-значное... Случайность желательна... но главное, просто чтобы не прослеживался принцип формирования числа
-Cheese- wrote:
> G>А зачем нужно генерировать именно 12-значное число, может GUID подойдет? > G>Необходима ли случайность, может даже IDENTITY подойдет? > > К сожалению нужно именно 12-значное... Случайность желательна... но > главное, просто чтобы не прослеживался принцип формирования числа
Ещё можно генерить следующим способом:
create table(number int autoincrement, pin int);
Т.е. часть числа, скажем 9 разрядов генерить последовательно (гарантия уникальности), а ещё 3 разряда — случайно (гарантируется невозможность угадывания).
Однако, это хуже защищает от перебора, перебрать нужно всего 1000 вариантов для данного числа (8 разрядов определяются легко — инкрементом, а остальные 3 просто перебираются).
Но если в твоей системе проверка каждого варианта технически сложна (например, нужно позвонить куда-нибудь и продиктовать номер, оставив свои паспортные данные), то вполне может подойти.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ., Вы писали:
.>_d_m_ wrote:
>> W>>Поле с типом uniqueidentifier не подходит? >> C>Нужно именно число и именно 12-значное.... >> А что uniqueidentifier уже не число? .>Оно 39-значное.
Ну так все таки число? Или по твоему нет?
>> Бери uniqueidentifier и соединяй куски XOR-ом. .>А почему ты решил, что после соединения получится уникальное 12-значное?
Что тебе конкретно непонятно: число знаков или что уникальное? То что уникальное, поверь на слово или почитай по технологиям шифрования — объяснять долго.
Решение:
declare @num binary(16);
set @num = newid();
declare @12digits bigint;
set @12digits = cast(@num as binary(5));
set @12digits = @12digits ^ substring(@num, 5, 4) ^ substring(@num, 9, 4) ^ substring(@num, 13, 4);
-- А это из-за ограничения на 12 десятичных знаковif @12digits > 0xE8D4A50FFF
set @12digits = @12digits / 2;
select @12digits;
Здравствуйте, _d_m_, Вы писали:
___>Что тебе конкретно непонятно: число знаков или что уникальное? То что уникальное, поверь на слово или почитай по технологиям шифрования — объяснять долго.
Зато я могу быстро: 12значных десятичных чисел всего лишь 10^12. Это примерно 2^36. А гуидов — 2^128.
Поэтому одному числу соответствуют примерно 2^92 гуидов. Поэтому мне совершенно непонятно, откуда возьмется уникальность этого числа.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.