Генерирование уникальных кодов

  • Автор темы Basilevs
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

Basilevs

Гость
#1
Необходимо генерировать уникальный код (ID)
1. Для потоков.
2. Для сборки.
3. Для конкретного компьютера.
(Уточняю: работает несколько потоков или приложений. Каждый(ое) занимается тем, что постоянно генерирует последовательности символов. Необходимо добиться их уникальности.)
Нельзя пользоваться GUID. Если использовать дату-время Ticks, даже один поток всё равно выдает по нескольку тысяч одинаковых выражений.... Подскажите, пожалуйста идеи реализации! Заранее спасибо!
 
B

Basilevs

Гость
#3
Для: Basilevs
Почему бы не использовать генератор псевдо-случайных чисел( класс Random )?
Смотри мою статью здесь http://codeby.net/forum/threads/11823.html
Случайные числа вообще-то на то и случайные, что неизвестно, какое значение они принимают... Так что значения могут повторяться!!! Мне нужны УНИКАЛЬНЫЕ коды!
 

grigsoft

Well-Known Member
15.11.2005
735
0
#4
А почему нельзя гуиды? И потом последовательность действительно случайных чисел повторяться не будет - иначе какие же это случайные числа?
 
I

IY@KOV

Гость
#5
мой личный опыт:

на одном компе из цифр от 0 до 9 при любых раскладках рандома (случайное, рандомайз, привязка к тикам...) один и тотже результат:

если у нас N (~>кол-во_чисел в квадрате) раз берется случайное число, то каждая цифра выпадет N/кол-во_чисел +- кол-во_чисел
 
B

Basilevs

Гость
#6
А почему нельзя гуиды? И потом последовательность действительно случайных чисел повторяться не будет - иначе какие же это случайные числа?
Гуиды нельзя, потому что задание такое.... А случайные числа на то и случайные, что всегда есть вероятность того, что они повторятся.
 

grigsoft

Well-Known Member
15.11.2005
735
0
#7
То, о чем вы говорите, это псевдослучайные числа. Они генерятся просто и повторяются. Настоящие случайные числа можно взять в библиотеках RSA, правда генерация 16 байт может добрую секунду идти.
Тогда такой вариант - 4 байта - хендл потока\процеса, 4 байта - какая-нибудь привязка к машине(или GetTickCount), и далее - тупой 8-байтовый счетчик, увеличивается при каждой посылке, начинается или с 0, или с rand().
 
B

Basilevs

Гость
#8
С потоками разобрался - просто Делаю Interlocked.Increment счётчика при генерировании.
С компьютером - надло, скорее всего, надо использовать файл... А что значит внутри сборки?
 
B

Basilevs

Гость
#9
То, о чем вы говорите, это псевдослучайные числа. Они генерятся просто и повторяются. Настоящие случайные числа можно взять в библиотеках RSA, правда генерация 16 байт может добрую секунду идти.
Тогда такой вариант - 4 байта - хендл потока\процеса, 4 байта - какая-нибудь привязка к машине(или GetTickCount), и далее - тупой 8-байтовый счетчик, увеличивается при каждой посылке, начинается или с 0, или с rand().
Спасибо! Очень толково объяснили! На самом деле!!!
А хэндлы обеспечивают уникальность?
 

grigsoft

Well-Known Member
15.11.2005
735
0
#10
Если процесс создался и работает - да (в пределах машины). Если процессы постоянно создаются и завершаются - нет. Но думаю что комбинация хендл+время+ранд будет достаточна уникальна.
 
B

Basilevs

Гость
#11
Спасибо!
Скажите, а что значит внутри сборки, и чем уникальность в компьютере отличается от уникальности в сборке? Это просто отдельная задача.
 
B

Basilevs

Гость
#12
И ещё:
Как получить хэндл данного процесса?
 
N

NikSoft

Гость
#13
Случайные числа вообще-то на то и случайные, что неизвестно, какое значение они принимают... Так что значения могут повторяться!!! Мне нужны УНИКАЛЬНЫЕ коды!
Для: Basilevs

Посмотри Д. Кнута "Исскуство программирования"(последнее издание). Там он приводит алгоритм генерирования псевдо-случайных чисел, который гарантирует уникальность по-крайней мере для первых трех миллионов псевдо-случайных чисел.
 
P

Pasha

Гость
#14
Случайные числа не повторяются? А последовательность 0 и 1, сгенеренная бросками монеты - это случайные числа?

<!--QuoteBegin-NikSoft+2:04:2007, 07:38 -->
<span class="vbquote">(NikSoft @ 2:04:2007, 07:38 )</span><!--QuoteEBegin-->Посмотри Д. Кнута "Исскуство программирования"(последнее издание). Там он приводит алгоритм генерирования псевдо-случайных чисел, который гарантирует уникальность по-крайней мере для первых трех миллионов псевдо-случайных чисел.
[snapback]60879" rel="nofollow" target="_blank[/snapback]​
[/quote]
Это при условии что все потребители будут использовать общий генератор СЧ.

Для: Basilevs
Числа, уникальные в пределах сборки, машины, в данный момент - это или гуиды, или обычный глобальный счетчик. Если очень надо сгенерировать Guid без использования Guid (странное ограничение), то напиши сервис, возвращающий MAC сетевой карты+Текущее время+Внутренний счетчик. И пусть все приложения на одной машине через него свои неGuidы получают.
 
N

NikSoft

Гость
#16
И ещё: Как получить хэндл данного процесса?
Для: Basilevs
Используй свойство Handle класса Process.
The handle that the operating system assigned to the associated process when the process was started. The system uses this handle to keep track of process attributes.
An application can obtain a handle to a process that can be used as a parameter to many process-information and control functions. You can use this handle to initialize a WaitHandle or to call native methods with platform invoke.
This process handle is private to an application--in other words, process handles cannot be shared. A process also has a process Id which, unlike the Handle, is unique and, therefore, valid throughout the system.
Only processes started through a call to Start set the Handle property of the corresponding Process instances.
 
P

Pasha

Гость
#17
<!--QuoteBegin-NikSoft+2:04:2007, 08:55 -->
<span class="vbquote">(NikSoft @ 2:04:2007, 08:55 )</span><!--QuoteEBegin-->Зачем говорить об очевидных вещах?
[snapback]60890" rel="nofollow" target="_blank[/snapback]​
[/quote]
Да потому что если есть возможность использовать общий генератор, то можно не заморачиватся и сделать просто общий счетчик, выдающий 1, 2, 3.... Уникальность гарантирована :)

И вообще, сам себе противоречишь:
<!--QuoteBegin-NikSoft+2:04:2007, 09:10 -->
<span class="vbquote">(NikSoft @ 2:04:2007, 09:10 )</span><!--QuoteEBegin-->A process also has a process Id which, unlike the Handle, is unique and, therefore, valid throughout the system.
[snapback]60899" rel="nofollow" target="_blank[/snapback]​
[/quote]
 
Статус
Закрыто для дальнейших ответов.