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

  • Автор темы 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
Спасибо!
Скажите, а что значит внутри сборки, и чем уникальность в компьютере отличается от уникальности в сборке? Это просто отдельная задача.
 
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]
 
Статус
Закрыто для дальнейших ответов.