В настоящее время Boost реализует класс random_device только для систем Linux (возможно, * nix). Кто-нибудь знает о существующих реализациях для других ОС? В идеале эти реализации должны быть с открытым исходным кодом.
Если такового не существует, как мне реализовать недетерминированный ГСЧ для Windows, а также Mac OS X? Существуют ли вызовы API в любой среде, которая предоставляет эту функциональность? Спасибо (и извините за все вопросы)!





Зависит от того, для чего вы хотите использовать свой ГСЧ.
В общих чертах, вы загружаете начальные данные в буфер, генерируете хеш-значения буфера, добавляете счетчик в результат и еще раз его хешируете. Причина использования хеш-функции заключается в том, что хорошие хеши предназначены для получения случайных результатов из более структурированных входных данных.
Если вы захотите использовать его для криптографии, все станет намного сложнее. Вам нужно будет перепрыгнуть через больше обручей, чтобы ваш ГСЧ продолжал повторять шаблоны в разумно безопасных пределах. Я могу порекомендовать «Практическую криптографию» Брюса Шнайера (для введения в ГСЧ и пример реализации). У него также есть кое-что связанное с ГСЧ о его тысячелистник RNG.
@orip: опять же зависит от использования. Для криптографических целей ГСЧ некоторых платформ оставляют желать лучшего.
Иногда (например, C) платформенный ГСЧ не подходит практически для всего, но создаваемые им последовательности навсегда замораживаются в стандартных документах.
В MacOSX вы можете использовать / dev / random (поскольку это * nix).
В Windows вам, вероятно, понадобится функция CryptGenRandom. Я не знаю, есть ли реализация boost :: random_device, которая его использует.
По словам frankodwyer, похоже, что / dev / random можно использовать для Mac. Всем спасибо, за помощь!
Если boost полагается на / dev / random, скорее всего, он работает и на MacOS (раз уж он у него есть).
В Windows есть CryptoAPI как часть ОС, который обеспечивает ГСЧ криптографического качества.
Кроме того, я считаю, что современные процессоры Intel имеют аппаратный ГСЧ на кристалле - однако вам придется выяснить, как это сделать в каждой ОС. Вероятно, лучше использовать API более высокого уровня.
edit: Вот ссылка на сайт о том, как работает Intel RNG
У OpenSSL есть достойный вариант.
#include <openssl/rand.h>
...
time_t now = time(NULL);
RAND_seed(&now, sizeof(now)); // before first number you need
int success = RAND_bytes(...);
if (!success) die_loudly();
RAND_cleanup(); // after you don't need any more numbers
У Microsoft CryptoAPI есть один на Win32. Требуется еще несколько вызовов функций. Не включая детали здесь, потому что для каждого из этих вызовов есть от 2 до 5 аргументов. Будьте осторожны, CryptoAPI, похоже, требует, чтобы у пользователя был правильно настроен полный локальный профиль (C: \ Documents and Settings \ user \ Local Settings), прежде чем он сможет выдать вам случайное число.
CryptAcquireContext // see docs
CryptGenRandom
CryptReleaseContext
лучше использовать криптографический ГСЧ платформы, чем реализовывать его самостоятельно