better random numbers (RAND_bytes)

This commit is contained in:
floty
2007-03-01 22:23:21 +00:00
parent e509785fd8
commit 520b22708e
3 changed files with 40 additions and 17 deletions
+1 -1
View File
@@ -125,7 +125,7 @@ win32 {
} }
!win32 { !win32 {
DEPENDPATH += src/net/linux/ DEPENDPATH += src/net/linux/
LIBS += -lboost_thread LIBS += -lboost_thread -l ssl
} }
CONFIG += qt release CONFIG += qt release
+37 -16
View File
@@ -33,37 +33,58 @@ Tools::~Tools()
void Tools::getRandNumber(int start, int end, int howMany, int* randArray, bool different) { void Tools::getRandNumber(int start, int end, int howMany, int* randArray, bool different) {
double r = end-start+1; int r = end-start+1;
unsigned char rand_buf[4];
unsigned int randNumber;
int i,j;
if (!different) { if (!different) {
int i;
for (i=0; i<howMany; i++) { for (i=0; i<howMany; i++) {
randArray[i] = start+(int)(r*rand()/(RAND_MAX+1.0)); if(!RAND_bytes(rand_buf,4)) {
RAND_pseudo_bytes(rand_buf,4);
}
randNumber = 0;
for(j=0; j<4; j++) {
randNumber += (rand_buf[j] << 8*j);
}
if(randNumber < ( (unsigned int) ( ((double)numeric_limits<unsigned int>::max()) / r ) ) * r) {
randArray[i] = start + (randNumber % r);
}
} }
} }
else { else {
int *tempArray = new int[end-start+1]; int *tempArray = new int[end-start+1];
int i;
for (i=0; i<(end-start+1); i++) tempArray[i]=1; for (i=0; i<(end-start+1); i++) tempArray[i]=1;
int temp;
int counter(0); int counter(0);
while (counter < howMany) { while (counter < howMany) {
temp = (int)(r*rand()/(RAND_MAX+1.0)); if(!RAND_bytes(rand_buf,4)) {
if (tempArray[temp] == 1) { RAND_pseudo_bytes(rand_buf,4);
}
randArray[counter] = temp+start; randNumber = 0;
tempArray[temp] = 0; for(j=0; j<4; j++) {
counter++; randNumber += (rand_buf[j] << 8*j);
}
if(randNumber < ( (unsigned int) ( ((double)numeric_limits<unsigned int>::max()) / r ) ) * r) {
randNumber = randNumber % r;
if (tempArray[randNumber] == 1) {
randArray[counter] = start + randNumber;
tempArray[randNumber] = 0;
counter++;
}
} }
else { continue; }
} }
+2
View File
@@ -21,6 +21,8 @@
#define TOOLS_H #define TOOLS_H
#include <iostream> #include <iostream>
#include <limits>
#include <openssl/rand.h>
class Tools{ class Tools{