Подтвердить что ты не робот

Реализация random_device в VS2010?

Из моего чтения стандарта random_device::entropy() должен возвращать 0.0, если используется программный движок. Однако в VS2010 он возвращает 32.0, что, по моему мнению, требует аппаратного обеспечения для создания недетерминированных случайных чисел.

Как VS2010 random_device генерирует последовательность чисел?

4b9b3361

Ответ 1

Согласно комментарию, оставленному по этому вопросу Хансом Пассантом, random_device использует advapi32:SystemFunction036, который согласно MSDN является псевдонимом для RtlGenRandom. Это подтверждается источником библиотеки времени исполнения, поставляемым с VС++ 2010:

random_device::operator()() в <random> вызывает следующую цепочку функций:

_Random_device() // in xrngdev.cpp
    rand_s()     // in rand_s.c
        RtlGenRandom()/SystemFunction036()  // in advapi32.dll

Согласно комментарию, оставленному Майклом Ховардом в одной из его статей в блоге, "Криптографически безопасное случайное число в Windows без использования CryptoAPI" , RtlGenRandom использует следующее:

RNG генерирует, как указано в приложении 3.1 FIPS 186-2, с SHA-1 как функция G. С энтропией от:

  • Текущий идентификатор процесса (GetCurrentProcessID).

  • Текущий идентификатор потока (GetCurrentThreadID).

  • Тики с момента загрузки (GetTickCount).

  • Текущее время (GetLocalTime).

  • Различные высокоточные счетчики производительности (QueryPerformanceCounter).

  • Хэш MD4 блока пользовательской среды, который включает имя пользователя, имя компьютера и путь поиска. MD4 - алгоритм хеширования который создает 128-битный дайджест сообщений из входных данных для проверки данных Целостность.

  • Высокоточные внутренние счетчики CPU, такие как RDTSC, RDMSR, RDPMC

  • Низкоуровневая системная информация: Время простоя, Io Чтение суммы перевода, Количество передачи записи ввода-вывода, ввод-вывод Другое количество передачи, чтение ввода-вывода Количество операций, количество операций ввода/вывода, ввод/вывод Другие операции, Доступные страницы, фиксированные страницы, фиксированный лимит, приоритет на пике, страница Количество ошибок, копирование на счетчик записи, количество переходов, переход кэш-памяти Count, Demero Zero Count, Count Count страницы, Чтение числа ввода/вывода, Cache Чтение подсчета, количество входов/выходов кеша, количество записей в грязных страницах, запись в память Dirty Write I/O Count, Mapped Pages Write Count, Mapped Write I/O Count, Paged Pool Страницы, страницы с невыполненными пулами, выгружаемый пул, выделенное пространство, выгружаемый пул Свободное место, Non Paged Pool Выделенное пространство, Non Paged Pool Свободное пространство, Запись в системной странице свободной системы, страница системного кода резидента, общая система Страницы драйверов, Всего системных кодовых страниц, Нейтральные пулы Lookaside Hits, Уличные выходы с постраничным бассейном, доступные страницы для пула, резидентная система Страница кэша, Страница резидентного выгружаемого пула, Страница драйвера резидентной системы, Менеджер кэша Быстрое чтение без ожидания, диспетчер кэша Fast Read с Подождите, менеджер кэша Fast Read Resource Missed, менеджер кэша Fast Read Невозможно, Менеджер кэша Быстрый список дескрипторов памяти Чтение с помощью Нет Подождите, менеджер кэша Быстрый список дескрипторов памяти Чтение с помощью Wait, Cache менеджер Быстрый список дескрипторов памяти Прочитанный ресурс отсутствует, кеш менеджер Быстрый список дескрипторов памяти Чтение не возможно, менеджер кэша Данные карты без ожидания, диспетчер кэша Карта данных с Wait, диспетчер кэша Данные карты без ожидания, миссия, диспетчер кэша. Данные карты ждут мисс, кэш менеджер Pin-Mapped Data Count, менеджер кэша Pin-Read с No Wait, Менеджер кэширования. Считывание с помощью Wait, диспетчер кэша. Пин-чтение без ожидания. Мисс, диспетчер кэшей Pin-Read Wait Miss, диспетчер кэширования Копировать-чтение с Нет ожидания, диспетчер кэширования. Копирование-чтение с помощью функции "Ожидание", "Менеджер кэша". Копирование с No Wait Miss, диспетчер кэша Copy-Read с Wait Miss, Cache менеджер Список дескрипторов памяти Чтение без ожидания, диспетчер кэша Память Список дескрипторов Чтение с ожиданием, диспетчер кэша Список дескрипторов памяти Чтение с помощью "Нет ожидания", диспетчер кэширования. Список дескрипторов памяти. Чтение с Подождите, мисс, менеджер кэша Прочитайте вперед IOs, менеджер кэша Lazy-Write IOs, Менеджер кэша Lazy-Write Pages, Менеджер кэша Data Flushes, Cache менеджер Страницы данных, Контекстные коммутаторы, Буфер перевода первого уровня Заполняет, заполняет буфер обмена второго уровня и системные вызовы.

  • Информация об исключении системы, состоящая из счета выравнивания, подсчета количества исключений, количества плавающей эмуляции и байтового слова Количество эмуляции.

  • Информация о статусе системы, состоящая из текущей глубины, максимальной глубины, суммарного распределения, выделения пропусков, суммарного освобождения, бесплатных пропусков, Тип, тег и размер.

  • Информация о системном прерывании, состоящая из переключателей контекста, подсчета вызовов отсроченной процедуры, скорости вызова отсроченной процедуры, времени инкремент, счетчик обхода отложенной процедуры и асинхронный счет обхода процедуры.

  • Информация о системном процессе, состоящая из смещения Next Entry, количества потоков, времени создания, времени пользователя, времени ядра, имени изображения, базы Приоритет, уникальный идентификатор процесса, унаследованный от уникального идентификатора процесса, ручка Счет, идентификатор сеанса, база данных каталога, максимальный виртуальный размер, виртуальный Размер, количество ошибок страницы, размер рабочего набора пиков, размер рабочего набора, квота Использование пикового выгружаемого бассейна, использование квоты с использованием выгружаемого пула, пик квоты без выгрузки Использование пула, использование квоты без использования Paged Pool, использование файла страницы, пиковая страница использование файла, количество частных страниц, количество операций чтения, запись Count, Other Operation Count, Read Transfer Count, Write Transfer Count и другой счетчик переводов.

Здесь содержится полное объяснение (включая диаграммы) в главе 8 написания безопасного кода, второе издание.

Ответ 2

Может быть, это ошибка, может быть, и нет. Но это наверняка выглядит преднамеренно. Из Microsoft собственная документация:

Класс описывает источник случайных чисел, предпочтительно от недетерминированное внешнее устройство. В этой реализации значения созданные по умолчанию, не являются недетерминированными. Они равномерно распределенных в замкнутом диапазоне [0, 65535].

И из стандарта С++ 11, раздел 26.5.6.6 на random_device:

result_type operator()();

Возвращает: Недетерминированное случайное значение, равномерно распределенных между min() и max(), включительно. это как определяется эти значения.

По строгим показаниям стандарта они не смогут вернуть ничего, кроме 0 из entropy(). Возможно, они планируют улучшить реализацию когда-нибудь и попытались заставить ее сделать что-то разумное на данный момент. У них есть вызов API для генерации криптографически безопасных случайных чисел, но, похоже, пока не используется для этого.