2013-07-17 2 views
5

리눅스에서 /dev/random을 사용하여 실제로 임의의 숫자를 생성하는 프로그램을 작성하려고하지만, 나중에 그 실행 시간이 때때로 용납 될 수 없다는 것을 알게됩니다. 그것의 C 버전은 지속적으로 빠르게 실행됩니다./dev/random을 사용하는 파일 io가 너무 오래 걸린다

#include <iostream> 
#include <fstream> 
using namespace std; 
int main(int argc,char*argv[]) 
{ 
    ifstream random("/dev/random", ios_base::in); 
    int t; 
    random.read(reinterpret_cast<char*>(&t), sizeof(t)); 
    cout << t << endl; 
    random.close(); 
    return 0; 
} 

시간

당신은 가능성이 엔트로피 풀을 배출 한
$: time ./random 
-1040810404 

real 0m0.004s 
user 0m0.000s 
sys 0m0.000s 

$: time ./random 
-1298913761 

real 0m4.119s 
user 0m0.000s 
sys 0m0.000s 
+0

"정말 임의의 숫자는"전체 컴퓨터 과학 세계 같은 건, – user2485710

+3

'는/dev/random'가 interrupts를 데이터에 대한 다른 하드웨어 타입의 이벤트에 따라 더 나은 용어로 자신을 설명합니다. 이것은 꽤 무작위 적이지만, 때때로 기다려야한다는 것을 의미합니다 (본 것처럼, 때로는 몇 바이트도 기다려야하는 긴 시간입니다). C 버전은'/ dev/random'보다는'/ dev/urandom'을 사용하고 있습니다. – Corbin

+0

@Corbin이 게시물에 "C++"라는 태그가 붙어 있습니다 ... 아직 점수를 얻지 못했습니다 ... – user2485710

답변

7

을 실행 시간 통계. Entropy 생성 (ok harvesting)은 예측할 수없는 물리적 세계의 품질을 샘플링하는 장치 드라이버를 기반으로합니다. 그러나 이러한 장치가별로 활발하지 않거나 엔트로피 생성 알고리즘이 중지되면 /dev/random에서 읽습니다.

/dev/urandom을 사용할 수 있습니까? 그렇지 않다면보다 결정적인 방식으로 더 많은 엔트로피를 생성 할 수있는 방법을 조사해야합니다. 여기

article regarding a similar problem에서 몇 가지 제안은 다음과 같습니다

  • 어쩌면 VED 같은 웹캠 노이즈 컬렉터와 결합, 오픈 마이크 데이터 센터에서 노이즈를 수집하는 AED와 같은 오디오 엔트로피 데몬을 포함한다. 다른 출처는 "디스크 장치의 공기 난류로부터의 암호화 임의성"에 대해 이야기하고 있습니다. :)
  • 엔트로피 수집 데몬을 사용하여 사용자 공간 프로그램의 임의성으로부터 약한 엔트로피를 수집합니다.
+3

또한 std :: ifstream은 기본적으로 버퍼링되기 때문에 프로그램을 실행할 때마다 몇 KB의 데이터를 파일 버퍼로 읽으므로 엔트로피 풀 순서가 읽기보다 빠릅니다 프로그램 실행 당 4 바이트. –

+0

@AdamRosenfield C 입력이 과도하게 버퍼링되지 않으면 (OTOH가 확실하지 않음) 언어 간 차이를 설명 할 수 있습니다. – michaelb958

+0

IMO @ AdamRosenfield의 대답은 "올바른"대답 일 가능성이 높습니다. 'setbuf (0, 0)'은 아마도 OP가 원하는 것일 것입니다. –

관련 문제