2012-05-18 3 views
2

확실히 임의 생성기를 사용할 수 없습니다. 현재 unixtime() + microtime()에서 CRC32 해시를 만들고 있습니다.랜덤 제네레이터의 랜덤 시드를 생성하는 방법은 무엇입니까?

hashing time() + microtime()보다 더 똑똑한 방법이 있습니까?

결과에서 완전히 만족스럽지는 않지만 더 무작위 적이기를 기대했지만 MicroTime()에 대한 호출을 추가 할 때까지 강한 패턴을 볼 수는 있지만 속도가 훨씬 느려지므로, 이렇게하는 최적의 방법을 찾고 있습니다.

이 바보 코드는 지금까지 만들 수있는 최고의 출력, 계산이 필요했다 생성 또는 I 출력에 약간의 패턴을 볼 수 있었다 :

starthash(crc32); 
    addtohash(crc32, MicroTime()); 
    addtohash(crc32, time(NULL)); // 64bit 
    addtohash(crc32, MicroTime()/13.37f); 
    addtohash(crc32, (10.0f-MicroTime())*1337.0f); 
    addtohash(crc32, (11130.0f-MicroTime())/1313137.0f); 
endhash(crc32); 

MicroTime을() 프로그램 시작부터 경과 마이크로 초를 반환합니다. 모든 가능한 유형에 addtohash()를 오버로드했습니다.

필자는 라이브러리가 아닌 솔루션을 사용하려고합니다. 어쨌든 아마 ~ 10 줄의 코드 일뿐입니다. 실제로 필요하지 않은 것 때문에 거대한 라이브러리를 설치하고 싶지는 않습니다. 더 관심이 있습니다. 함수 호출에서 사용하는 것보다 코드에서.

+1

크로스 플랫폼은 어떻게되어야합니까? :) –

+1

시드가 "좋은지"아닌지는 의사 랜덤 데이터를 사용하는 대상에 따라 다릅니다. PRNG가 다른 시간에 다른 데이터를 출력한다는 유일한 요구 사항이라면 시간을 사용하는 것이 좋습니다. 그러나 프로그램이 실행될 때마다 한 번 PRNG를 시드하려면 CryptGenRandom을 사용할 수도 있습니다. –

+1

좋은 cryprographic rng에 시드가 내장되어 있어야합니다. 다른 RNG는 이것을 필요로하지 않습니다. –

답변

3

의심되는 경우 Windows에서 CryptGenRandom의 시드를 얻거나 * NIX 시스템에서 dev/random 또는 dev/urandom을 읽습니다.

이것은 과장 될 수 있지만 성능상의 문제가 발생하지 않는 한 시간과 같은 낮은 엔트로피 소스를 망칠 필요가 없습니다.

과소 평가되지는 않습니다. 그리고 고품질의 안전한 무작위 데이터가 실제로 필요한 코드를 작성하고 질문에서 언급하는 것을 귀찮게하지 않은 경우

+0

테스트를 마쳤습니다. 어둡지 만 2 배 느린 것으로 보입니다. 시간이 없다면 어떻게 될까요? (즉, 내가 관심을 가지고있는 부분). – Rookie

+0

@ 루키 그래서 느린 경우에는 어떨까요? 프로그램 당 한 번만 발전기를 시딩 할 것입니다.(그렇지 않은 경우 :'time()'과'getpid()'/'GetCurrentProcessId()'의 결과를 해시하여 좋은 결과를 얻었습니다. 그러나 스티브가 제시 한 해결책만큼 좋은 곳은 어디에도 없습니다.) –

+0

@JamesKanze, 정말 단 한 번도 아닙니다. 하지만 속도는 그다지 중요하지 않으며, 진행되는 것에 관심이 있습니다. 왜 그렇게 느리고 더 빨리 만들 수 있으며, 왜 그렇게 할 수 없습니까? 비록 그것이 'CryptGenRandom'을 고집 할 것이라고 생각 하나, xor128 시드를 4 대신에 16 바이트를 생성한다고 말하면서 하나의 실행에서 xor128 시드를 생성 할 수 있기 때문에 더 빨리 수행 할 수도 있습니다. – Rookie

0

lfsr &을 확인할 수 있습니다. 의사 랜덤 생성기 .. 보통 이것은 하드웨어 솔루션이지만 쉽게 자신의 소프트웨어를 구현할 수 있습니다 lfsr

+0

내 현재 crc32 해시와 같은 선형 피드백 시프트 레지스터가 작동하지 않습니까? – Rookie

+0

예, crc 계산은 lfsr을 기반으로합니다. 난 당신이 원하는대로 (길이, 초기 시드, polyonym 등)을 구성 할 수있는 하나의 여분의 lfsr을 사용하여 의사 난수 생성기로 작동하도록 제안했다. 이것은 당신이 crc 또는 당신이 필요로하는 것을 계산하는 입력 데이터 일 수 있습니다. – amanda

관련 문제