Уникальное число
От: -Cheese-  
Дата: 08.07.08 12:19
Оценка:
Всем привет.
Поиском пользовался, решения не нашёл
Допустим есть таблица с данными кодов пополнения (например prepaid для телефонов).
При добавлении записи в таблицу нужно генерировать уникальное число (допустим 12-значное), но что бы оно шло не по порядку и не повторялось уже в таблице.
... << RSDN@Home 1.2.0 alpha 4 rev. 1092>>
Re: Уникальное число
От: -Cheese-  
Дата: 08.07.08 12:25
Оценка:
P.s.: не по порядку понимать как в случайном порядке (или нечно подобное)
И это... база MS SQL 2005
... << RSDN@Home 1.2.0 alpha 4 rev. 1092>>
Re: Уникальное число
От: Were  
Дата: 08.07.08 12:38
Оценка:
Здравствуйте, -Cheese-, Вы писали:

C>Всем привет.

C>Поиском пользовался, решения не нашёл
C>Допустим есть таблица с данными кодов пополнения (например prepaid для телефонов).
C>При добавлении записи в таблицу нужно генерировать уникальное число (допустим 12-значное), но что бы оно шло не по порядку и не повторялось уже в таблице.

Поле с типом uniqueidentifier не подходит?
Re[2]: Уникальное число
От: -Cheese-  
Дата: 08.07.08 12:45
Оценка:
Здравствуйте, Were, Вы писали:

C>>При добавлении записи в таблицу нужно генерировать уникальное число (допустим 12-значное), но что бы оно шло не по порядку и не повторялось уже в таблице.


W>Поле с типом uniqueidentifier не подходит?

Нужно именно число и именно 12-значное....
... << RSDN@Home 1.2.0 alpha 4 rev. 1092>>
Re: Уникальное число
От: . Великобритания  
Дата: 08.07.08 16:25
Оценка: +1
-Cheese- wrote:

> Поиском пользовался, решения не нашёл

> Допустим есть таблица с данными кодов пополнения (например prepaid для
> телефонов).
> При добавлении записи в таблицу нужно генерировать уникальное число
> (допустим 12-значное), но что бы оно шло не по порядку и не повторялось
> уже в таблице.
С точки зрения безопасности самое надёжное — генерить число случайно (каким-нибудь "правильным" генератором случайных чисел) и держать таблицу уже сгенерённых, проверяя на дупликаты.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Уникальное число
От: Mr.Cat  
Дата: 08.07.08 16:48
Оценка:
Здравствуйте, -Cheese-, Вы писали:
Способ для извращенцев:
1. Нагенерить много последовательных чисел
2. Перемешать
3. Выбирать последовательно
Re[3]: Уникальное число
От: _d_m_  
Дата: 09.07.08 00:50
Оценка:
Здравствуйте, -Cheese-, Вы писали:

C>Здравствуйте, Were, Вы писали:


C>>>При добавлении записи в таблицу нужно генерировать уникальное число (допустим 12-значное), но что бы оно шло не по порядку и не повторялось уже в таблице.


W>>Поле с типом uniqueidentifier не подходит?

C>Нужно именно число и именно 12-значное....

А что uniqueidentifier уже не число?
Бери uniqueidentifier и соединяй куски XOR-ом.
Re: Уникальное число
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.07.08 03:15
Оценка:
Здравствуйте, -Cheese-, Вы писали:

C>Всем привет.

C>Поиском пользовался, решения не нашёл
C>Допустим есть таблица с данными кодов пополнения (например prepaid для телефонов).
C>При добавлении записи в таблицу нужно генерировать уникальное число (допустим 12-значное), но что бы оно шло не по порядку и не повторялось уже в таблице.
Генерируй случайное, в таблице заведи unique constraint на это поле, при записи отлавливай constraint violation и перегенерируй до тех пор, пока не получится уникальное.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Уникальное число
От: -Cheese-  
Дата: 09.07.08 06:20
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Генерируй случайное, в таблице заведи unique constraint на это поле, при записи отлавливай constraint violation и перегенерируй до тех пор, пока не получится уникальное.


В принципе я тоже так думал, но чем дальше — тем дольше это число будет генериться....
... << RSDN@Home 1.2.0 alpha 4 rev. 1092>>
Re[3]: Уникальное число
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.07.08 06:58
Оценка:
Здравствуйте, -Cheese-, Вы писали:
C>В принципе я тоже так думал, но чем дальше — тем дольше это число будет генериться....
А ты посчитай характерное количество попыток в зависимости от количества записей. При условии, что всего 12-значных чисел — один триллион.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Уникальное число
От: . Великобритания  
Дата: 09.07.08 07:44
Оценка: +1
_d_m_ wrote:

> W>>Поле с типом uniqueidentifier не подходит?

> C>Нужно именно число и именно 12-значное....
> А что uniqueidentifier уже не число?
Оно 39-значное.

> Бери uniqueidentifier и соединяй куски XOR-ом.

А почему ты решил, что после соединения получится уникальное 12-значное?
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Уникальное число
От: Jyk Россия  
Дата: 12.07.08 06:23
Оценка: :))
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, -Cheese-, Вы писали:

C>>В принципе я тоже так думал, но чем дальше — тем дольше это число будет генериться....
S>А ты посчитай характерное количество попыток в зависимости от количества записей. При условии, что всего 12-значных чисел — один триллион.

Только при 100.000 записей поподание в существующее число уже около 50%
Re[5]: Уникальное число
От: Jyk Россия  
Дата: 12.07.08 06:29
Оценка:
Совершенно согласен с Mr.Cat, идея интересная и реализуемая но для извращенцев... однако есть и еще один вариантик, что если действительно генерить случайное число и проверять его на совпадения, и если не подходит не генерить новое а искать следующее не занатое, добавляя каждый раз по единице к случайно сгенерированному ранее числу.
Re[5]: Уникальное число
От: . Великобритания  
Дата: 12.07.08 11:54
Оценка:
Jyk wrote:

> количества записей. При условии, что всего 12-значных чисел — один триллион.

>
> Только при 100.000 записей поподание в существующее число уже около 50%
Это ты как посчитал? Чтобы было 50%, записей должно быть 500.000.000.000 (500млрд). А если человек делает это числа для каких-то там платежей, и если один платёж 1 руб, то даже если ему понадобится 1млрд случайных чисел, это значит он уже миллиардер.

А прибавлять единицу нельзя, это портит случайность (и не изменяет вероятность, тебе это только кажется, что изменяет). Нужно генерить ещё одно число.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Уникальное число
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 12.07.08 19:30
Оценка:
Здравствуйте, -Cheese-, Вы писали:

C>Всем привет.

C>Поиском пользовался, решения не нашёл
C>Допустим есть таблица с данными кодов пополнения (например prepaid для телефонов).
C>При добавлении записи в таблицу нужно генерировать уникальное число (допустим 12-значное), но что бы оно шло не по порядку и не повторялось уже в таблице.

А зачем нужно генерировать именно 12-значное число, может GUID подойдет?
Необходима ли случайность, может даже IDENTITY подойдет?
Re[5]: Уникальное число
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.07.08 04:46
Оценка:
Здравствуйте, Jyk, Вы писали:
Jyk>Только при 100.000 записей поподание в существующее число уже около 50%
Это ты как посчитал? По формуле блондинки?
Вот у нас есть K=10^5 записей. Вероятность того, что число Q, случайно выбранное из N, совпадет с одним из K, равна K/N. Это 10^-7, что, мягко говоря, чуть меньше, чем 50 процентов.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Уникальное число
От: -Cheese-  
Дата: 14.07.08 11:04
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>А зачем нужно генерировать именно 12-значное число, может GUID подойдет?

G>Необходима ли случайность, может даже IDENTITY подойдет?

К сожалению нужно именно 12-значное... Случайность желательна... но главное, просто чтобы не прослеживался принцип формирования числа
... << RSDN@Home 1.2.0 alpha 4 rev. 1092>>
Re[3]: Уникальное число
От: . Великобритания  
Дата: 14.07.08 12:20
Оценка:
-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
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Уникальное число
От: _d_m_  
Дата: 15.07.08 02:48
Оценка: -2
Здравствуйте, ., Вы писали:

.>_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;
Re[6]: Уникальное число
От: Sinclair Россия https://github.com/evilguest/
Дата: 15.07.08 04:15
Оценка: -1
Здравствуйте, _d_m_, Вы писали:

___>Что тебе конкретно непонятно: число знаков или что уникальное? То что уникальное, поверь на слово или почитай по технологиям шифрования — объяснять долго.

Зато я могу быстро: 12значных десятичных чисел всего лишь 10^12. Это примерно 2^36. А гуидов — 2^128.
Поэтому одному числу соответствуют примерно 2^92 гуидов. Поэтому мне совершенно непонятно, откуда возьмется уникальность этого числа.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.