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

Тема в разделе ".NET", создана пользователем Basilevs, 31 мар 2007.

Наш партнер Genesis Hackspace
Статус темы:
Закрыта.
  1. Basilevs

    Basilevs Гость

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

    NikSoft Гость

    Для: Basilevs
    Почему бы не использовать генератор псевдо-случайных чисел( класс Random )?
    Смотри мою статью здесь http://codeby.net/forum/threads/11823.html
     
  3. Basilevs

    Basilevs Гость

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

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    А почему нельзя гуиды? И потом последовательность действительно случайных чисел повторяться не будет - иначе какие же это случайные числа?
     
  5. IY@KOV

    IY@KOV Гость

    мой личный опыт:

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

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

    Basilevs Гость

    Гуиды нельзя, потому что задание такое.... А случайные числа на то и случайные, что всегда есть вероятность того, что они повторятся.
     
  7. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    То, о чем вы говорите, это псевдослучайные числа. Они генерятся просто и повторяются. Настоящие случайные числа можно взять в библиотеках RSA, правда генерация 16 байт может добрую секунду идти.
    Тогда такой вариант - 4 байта - хендл потока\процеса, 4 байта - какая-нибудь привязка к машине(или GetTickCount), и далее - тупой 8-байтовый счетчик, увеличивается при каждой посылке, начинается или с 0, или с rand().
     
  8. Basilevs

    Basilevs Гость

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

    Basilevs Гость

    Спасибо! Очень толково объяснили! На самом деле!!!
    А хэндлы обеспечивают уникальность?
     
  10. grigsoft

    grigsoft Well-Known Member

    Регистрация:
    15 ноя 2005
    Сообщения:
    735
    Симпатии:
    0
    Если процесс создался и работает - да (в пределах машины). Если процессы постоянно создаются и завершаются - нет. Но думаю что комбинация хендл+время+ранд будет достаточна уникальна.
     
  11. Basilevs

    Basilevs Гость

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

    Basilevs Гость

    И ещё:
    Как получить хэндл данного процесса?
     
  13. NikSoft

    NikSoft Гость

    Для: Basilevs

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

    Pasha Гость

    Случайные числа не повторяются? А последовательность 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ы получают.
     
  15. NikSoft

    NikSoft Гость

    Зачем говорить об очевидных вещах?
     
  16. NikSoft

    NikSoft Гость

    Для: Basilevs
    Используй свойство Handle класса Process.
     
  17. Pasha

    Pasha Гость

    <!--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]
     
Загрузка...
Похожие Темы - Генерирование уникальных кодов
  1. Medevic
    Ответов:
    1
    Просмотров:
    2.416
  2. RixPvl
    Ответов:
    13
    Просмотров:
    3.831
Статус темы:
Закрыта.

Поделиться этой страницей