Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.15.143.162] |
|
Сообщ.
#1
,
|
|
|
Студия 2003, проект старый на MFC.
Нужен генератор случайных чисел для получения случайного ключа. srand(time(NULL)) - для rand не подходит - время запуска программы общеизвестно. Много пересмотрел источников, есть или огромные библиотеки, или решения на новых версиях С++ Возможно у кого то в примерах есть готовый вариант такой функции? |
Сообщ.
#2
,
|
|
|
Общего решения не существует. Любой алгоритм является формальной последовательностью действий, поэтому априори неслучаен. Чтобы выход алгоритма мог быть недетерминированным, он должен основываться на недетерминированных входах. Если в системе не существует подобных источников данных, задача нерешаема.
В той или иной системе часто можно найти подобные источники, но они сильно зависят от самой системы. Например, в процессорах Intel есть инструкции RDRAND и RDSEED, работают ужасно медленно, но очень качественно. Имеются с 3-го поколения процессоров iCore. В любом случае их наличие можно проверить через CPUID. Но это не C, конечно, это уже ассемблер. Также можно попытаться поиграться с неопределённым поведением, например, заглянув в неинициализированные автоматические переменные или просто поглубже в стек, но чем это чревато, объяснять, думаю, излишне. Под Windows можно поиграться с сильно многопоточным кодом, где потоков гораздо больше процессорных ядер. Например, отслеживая порядок активизации потоков, основываясь т.о. на недокументированности планировщика потоков ОСи, но недокументированность всё ж не недетерминированность. Самый ИМХО разумный выбор – https://www.random.org, но это уже не столько C, сколько Web. |
Сообщ.
#3
,
|
|
|
Цитата MaIron @ время запуска программы общеизвестно. А время запуска процессора? Может RDTSC подойдет? |
Сообщ.
#4
,
|
|
|
Цитата shm @ Цитата MaIron @ время запуска программы общеизвестно. А время запуска процессора? Может RDTSC подойдет? О! То, что нужно! Вызов модуля осуществляется на удалённой машине. Для текущей задачи, этого более чем достаточно. И напрямую через ASM вставку на MFC проекте пошло! unsigned __int64 rdtscval; __asm { rdtsc lea ebx, rdtscval mov [ebx], eax mov [ebx+4], edx } CString str; str.Format(_T("%I64u"), rdtscval); shm и Qraizer Спасибо!!! |
Сообщ.
#5
,
|
|
|
Цитата MaIron @ Студия 2003, проект старый на MFC. Нужен генератор случайных чисел для получения случайного ключа. srand(time(NULL)) - для rand не подходит - время запуска программы общеизвестно. Много пересмотрел источников, есть или огромные библиотеки, или решения на новых версиях С++ Возможно у кого то в примерах есть готовый вариант такой функции? Для генерации КЛЮЧЕЙ ф-я rand в принципе не подходит. Последовательность генерируемая rand восстанавливается полностью по нескольким значениям. Всё равно srand со случайным аргументом или нет. |