2009-07-29 1 views

답변

8

번호 qrand은 정수에 맞게 고유 번호를 생성 할 수 있으므로 구현에 관계없이 고유성은 신뢰할 수 없습니다.

또한 서로 다른 시드가 다른 임의의 정수를 생성한다는 사실을 알게되면 효과적으로 예측할 수없는 수준의 수치가 생성되어 qrand은 더 이상 무작위가 아닙니다.

편집 : 나는 만화를 게시함으로써 너를 놀리려고하지 않는다고 맹세한다. 나는 이것이 아주 좋은 문제의 설명이다 생각 : QRand 표준 랜드() 단지 스레드 안전 버전입니다 Qt Documentation에 따르면

alt text http://www.dilbert.com/dyn/str_strip/000000000/00000000/0000000/000000/00000/2000/300/2318/2318.strip.gif

+0

Qrand는 qrand()가 0과 RAND_MAX 사이의 값을 반환한다고 말합니다. qrand()가 프로그램 실행 중에 다른 시간에 호출되면 고유 한 숫자를 생성합니까? - 감사합니다. –

+2

아니요. – balpha

+0

qrand는 의사 랜덤 생성기 일 뿐이므로 값이 고유하다는 보장은 없습니다. 자신을 확인해야합니다. 세트에서 생성 된 숫자를 저장합니다. – nos

0

, 내가 사용하는 방법은 가정 않을 것 그 설명에 기반하여 rand()보다 안전하거나 우월합니다.

난 당신이 '고유 한'임의의 숫자와는 다른 용어를 사용할 필요가 있다고 생각 (더 사이비 - 난수 생성기가하는 독특한 스트림을 생성하지 않습니다 입력 X와 같은 것입니다 항상 생산 출력 Y). 무엇이 실제 상황입니까?

+0

서버 프로세스가 실행 중이고 클라이언트가 연결할 때 고유 한 무작위 값을 세션 ID로 할당하려고합니다. –

+0

아 ... 지금 당신이 원하는 것을 봅니다. qrand() * alone *은 작동하지 않지만 이전에 할당 된 (활성) 세션 ID 테이블에 qrand()를 사용하여 값을 클라이언트에 보내기 전에 고유 한 값인지 확인할 수 있습니다. 귀하의 필요에 따라 충분할 수도 있습니다. 그러나 qrand() 대신에 Linux에서/dev/urandom을 읽는 것과 같은 다른 PRNG를 조사하고 싶을 수도 있습니다. – Kitsune

6

세션 ID를 저장하는 방법에 따라 UUID를 사용하여 (대부분) 보장 된 고유 식별자를 생성 할 수 있습니다. QUuid에 대한 설명서를 참조하십시오. 또한이 사실을 알고 있어야합니다 (굵게 표시됨) :

createUuid()도 사용할 수 있습니다. createUuid()에 의해 생성 된 UUID는 임의 유형입니다. 이들의 QUuid::Version 비트는 QUuid::Random으로 설정되고 QUuid::Variant 비트는 QUuid::DCE으로 설정됩니다. 나머지 UUID는 난수로 구성됩니다. 이론적으로 이는 createUuid()에 의해 생성 된 UUID가 고유하지 않을 가능성이 적음을 의미합니다.하지만 아주 작은 기회입니다.

생성 된 UUID가 반드시 고유 할 필요는 없다는 사실을 보증 할 수 있으므로 고유해야 할 필요가있는 경우 libuuid 또는 이와 유사한 내용을 살펴보십시오.