Используете аппаратный генератор песчаных мостов для создания случайных чисел? - PullRequest
9 голосов
/ 26 октября 2011

Мне было интересно, есть ли способ использовать новый аппаратный генератор истинных чисел, найденный в процессоре Intel Sandy Bridge?Я читал, что MKL (Math Kernel Library) от Intel предоставляет эту функциональность, но для этого требуется набор MKL и компилятор intel, что в итоге обойдется довольно дорого.

Есть ли другой способ использовать аппаратный генератор случайных чисел в моем C ++код?Например, хорошая библиотека с заголовками?

Ответы [ 3 ]

9 голосов
/ 28 июня 2013

Корпорация Intel опубликовала руководство, библиотеку и примеры кода для инструкции rdrand на http://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide.

Из файла Readme:

"Поскольку многие наборы инструментов компилятора не поддерживают эту новую инструкцию, эта библиотека была создан для облегчения доступа к нему. Идея проста: ссылка на встроенную статическую библиотеку и наслаждайтесь новой функцией! "

Примеры всех библиотечных вызовов приведены в main.c.

Мне удалось скомпилировать статическую библиотеку и тестовую программу в gcc на Mac OS X. В документации говорится, что она также совместима с Linux и Windows.

Имейте в виду, что rdrand на самом деле является 128-битным генератором псевдослучайных чисел с аппаратно генерируемой энтропией. (Предстоящая архитектура Broadwell предоставит инструкцию rdseed для доступа к генератору истинных случайных чисел.) Подробности различий и их последствий можно найти под заголовком «Длинный ответ» по адресу http://software.intel.com/en-us/blogs/2012/11/17/the-difference-between-rdrand-and-rdseed.

1 голос
/ 06 июля 2017

Вот пример кода:

#include <immintrin.h>
#include <cstdint>
...
uint64_t val;
if(!_rdseed64_step(&val)) {
  printf("Error generating hardware random value\n");
}
// Now val contains 64-bit pseudo-random number

uint64_t val;
if(!_rdrand64_step(&val)) {
  printf("Error generating hardware random value\n");
}
// Now val contains 64-bit true random number

Ссылка: Intel Intrinsics Guide

0 голосов
/ 26 октября 2011

Это может зависеть от вашей операционной системы.Я мог бы предположить, что последние ядра GNU / Linux могут использовать аппаратные генераторы случайных чисел, например, для /dev/random (поскольку страница руководства random(4) предполагает, что он использует шум), но я могу ошибаться.

Обычная практиказаключается в использовании некоторого распространенного псевдослучайного генератора (например, стандартной функции random(3)), но для его заполнения при запуске приложения из более случайного источника (например, чтения /dev/urandom, использования getpid() и чего-то изтекущее время с gettimeofday() и т. д.).

Очень вероятно, получение очень хороших случайных чисел - это черное искусство, по крайней мере для меня.Но вышеупомянутое решение имеет, по крайней мере, то преимущество, что его нельзя легко воспроизвести из одного запуска приложения в другое.

Если ваше приложение работает долго (например, веб-служба работает в одном и том же отдельном процессе в течение многих часов), вывозможно, время от времени может заново генерироваться ваш генератор псевдослучайных чисел.Я полагаю, что для веб-сервера вы также можете использовать времена запросов (измеряя их с точностью до миллисекунды) в качестве источника случайности (для заполнения вашего PRNG).

...