1
0
mirror of https://github.com/stefanocasazza/ULib.git synced 2025-09-28 19:05:55 +08:00
This commit is contained in:
stefanocasazza 2018-07-03 14:21:21 +02:00
parent fd941c38c0
commit b1094e9481
18 changed files with 115 additions and 88 deletions

View File

@ -182,20 +182,77 @@ static inline uint32_t u_nextPowerOfTwo(uint32_t n)
#endif
}
/* Random number generator */
U_EXPORT double u_get_uniform(void);
U_EXPORT uint32_t u_get_num_random(uint32_t range);
/**
* Random number generator
*
* We use George Marsaglia's MWC algorithm to produce an unsigned integer
*
* see http://www.bobwheeler.com/statistics/Password/MarsagliaPost.txt
*/
static inline void u_set_seed_random(uint32_t u, uint32_t v)
{
U_INTERNAL_TRACE("u_set_seed_random(%u,%u)", u, v)
if (u != 0) u_m_w = u;
if (v != 0) u_m_z = v;
U_INTERNAL_ASSERT_MAJOR(u, 0)
U_INTERNAL_ASSERT_MAJOR(v, 0)
u_m_w = u;
u_m_z = v;
}
static inline uint32_t u_get_num_random(void)
{
U_INTERNAL_TRACE("u_get_num_random()")
U_INTERNAL_ASSERT_MAJOR(u_m_w, 0)
U_INTERNAL_ASSERT_MAJOR(u_m_z, 0)
u_m_z = 36969 * (u_m_z & 65535) + (u_m_z >> 16);
u_m_w = 18000 * (u_m_w & 65535) + (u_m_w >> 16);
return (u_m_z << 16) + u_m_w; /* 0 <= u < 2^32 */
}
static inline uint32_t u_get_num_random_range0(uint32_t range)
{
uint32_t result;
U_INTERNAL_TRACE("u_get_num_random_range0(%u)", range)
U_INTERNAL_ASSERT_MAJOR(range, 1)
result = u_get_num_random() % range;
U_INTERNAL_ASSERT_MINOR(result,range)
return result;
}
static inline uint32_t u_get_num_random_range1(uint32_t range)
{
uint32_t result;
U_INTERNAL_TRACE("u_get_num_random_range1(%u)", range)
U_INTERNAL_ASSERT_MAJOR(range, 2)
result = (u_get_num_random() % (range-1))+1;
U_INTERNAL_ASSERT_RANGE(1,result,range-1)
return result;
}
/* Produce a uniform random sample from the open interval (0, 1). The method will not return either end point */
static inline double u_get_uniform(void)
{
U_INTERNAL_TRACE("u_get_uniform()")
/* The magic number below is 1/(2^32 + 2). The result is strictly between 0 and 1 */
return (u_get_num_random() + 1.0) * 2.328306435454494e-10;
}
U_EXPORT const char* u_get_mimetype(const char* restrict suffix, int* pmime_index);

View File

@ -176,7 +176,10 @@ struct U_EXPORT UServices {
UString code(len);
char* ptr = code.data();
for (uint32_t i = 0; i < len; ++i, ++ptr) *ptr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[u_get_num_random(64 - 3)];
for (uint32_t i = 0; i < len; ++i, ++ptr)
{
*ptr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"[u_get_num_random_range0(U_CONSTANT_SIZE("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"))];
}
code.size_adjust(len);

View File

@ -514,7 +514,7 @@ void u_initRandom(void)
/* seed the random generator */
u_set_seed_random(u_seed_hash >> 16, u_seed_hash % 4294967296);
u_set_seed_random(1+(u_seed_hash >> 16), 1+(u_seed_hash % 4294967296));
}
time_t u_getLocalNow(time_t sec)

View File

@ -2671,53 +2671,6 @@ int u_splitCommand(char* restrict s, uint32_t n, char** restrict argv, char* res
return result;
}
/**
* We use George Marsaglia's MWC algorithm to produce an unsigned integer.
*
* see http://www.bobwheeler.com/statistics/Password/MarsagliaPost.txt
*/
uint32_t u_get_num_random(uint32_t range)
{
uint32_t result;
U_INTERNAL_TRACE("u_get_num_random(%u)", range)
U_INTERNAL_ASSERT_MAJOR(u_m_w, 0)
U_INTERNAL_ASSERT_MAJOR(u_m_z, 0)
u_m_z = 36969 * (u_m_z & 65535) + (u_m_z >> 16);
u_m_w = 18000 * (u_m_w & 65535) + (u_m_w >> 16);
result = (u_m_z << 16) + u_m_w;
if (range)
{
result = (result % range)+1;
U_INTERNAL_ASSERT(result <= range)
}
return result;
}
/* Produce a uniform random sample from the open interval (0, 1). The method will not return either end point */
double u_get_uniform(void)
{
uint32_t u;
U_INTERNAL_TRACE("u_get_uniform()")
/* 0 <= u < 2^32 */
u = u_get_num_random(0);
/* The magic number below is 1/(2^32 + 2). The result is strictly between 0 and 1 */
return (u + 1.0) * 2.328306435454494e-10;
}
/**
* Function fnmatch() as specified in POSIX 1003.2-1992, section B.6. Compares a filename or pathname to a pattern
*/

View File

@ -126,7 +126,7 @@ void* USimulationError::checkForMatch(const char* call_name)
uint32_t range = (uint32_t) strtol(file_ptr, &file_ptr, 10);
if (range > 0) match = (u_get_num_random(range) == (range / 2));
if (range > 0) match = (u_get_num_random_range1(range) == (range / 2));
break;
}

View File

@ -32,7 +32,7 @@ static void usp_fork_db()
<!--#code
World::initOneResult();
World::pworld_query->id = World::rnumber[u_now->tv_usec % 500];
World::pworld_query->id = World::rnumber[0];
#ifdef U_STATIC_ORM_DRIVER_PGSQL
if (pdrv)

View File

@ -9,12 +9,21 @@ static void usp_fork_query() { World::handlerForkSql(); }
-->
<!--#header
-->
<!--#code
(void) World::pstmt_query->asyncPipelineMode(World::handlerResultSql);
<!--#vcode
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
/*
if (num_queries >= 20 &&
UServer_Base::startParallelization())
{
return;
}
*/
-->
<!--#code
World::initResult();
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
(void) World::pstmt_query->asyncPipelineMode(World::handlerResultSql);
for (uint32_t i = 0; i < num_queries; ++i)
{

View File

@ -51,7 +51,7 @@ if (UOrmDriver::isAsyncPipelineModeAvaliable() == false)
World::pstmt_query->execute();
World::pworld_query->randomNumber = u_get_num_random(10000-1);
World::pworld_query->randomNumber = u_get_num_random_range1(10000);
pstmt_update->execute();
@ -76,7 +76,7 @@ else
*pquery++ = ',';
pquery = u_num2str32(World::pworld_query->randomNumber = u_get_num_random(10000-1), pquery);
pquery = u_num2str32(World::pworld_query->randomNumber = u_get_num_random_range1(10000), pquery);
u_put_unalignedp16(pquery, U_MULTICHAR_CONSTANT16(')',','));
pquery += 2;

View File

@ -239,7 +239,7 @@ public:
{
U_TRACE_NO_PARAM(0, "World::handlerFork()")
if (rnumber[0] == 0) for (uint32_t i = 0; i < 500; ++i) rnumber[i] = u_get_num_random(10000-1);
if (rnumber[0] == 0) for (uint32_t i = 0; i < 500; ++i) rnumber[i] = u_get_num_random_range1(10000);
}
static void handlerForkSql()

View File

@ -75,11 +75,9 @@ public:
World::initOneResult();
uint32_t i = u_now->tv_usec % 500;
handlerQuery(World::rnumber[0]);
handlerQuery(World::rnumber[i]);
handlerOneResult(World::rnumber[i]);
handlerOneResult(World::rnumber[0]);
World::endOneResult();
}
@ -138,7 +136,7 @@ public:
# ifdef USE_MONGODB
(void) mc->findOne(World::rnumber[i], query);
(void) mc->update( World::rnumber[i], "randomNumber", World::rnum = u_get_num_random(10000-1));
(void) mc->update( World::rnumber[i], "randomNumber", World::rnum = u_get_num_random_range1(10000));
# endif
}
@ -206,7 +204,7 @@ public:
(void) rc->get(start, ptr-start);
*ptr = ' ';
ptr = u_num2str32(World::rnum = u_get_num_random(10000-1), ptr+1);
ptr = u_num2str32(World::rnum = u_get_num_random_range1(10000), ptr+1);
(void) rc->mset(start, ptr-start);
}
@ -262,7 +260,7 @@ public:
U_TRACE(0, "WorldNoSql::handlerUpdateElasticSearch(%u)", i)
uint32_t len1 = u__snprintf(pbuffer1, 100, U_CONSTANT_TO_PARAM("%u/_update"), World::rnumber[i]),
len2 = u__snprintf(pbuffer2, 100, U_CONSTANT_TO_PARAM("%u\"}}"), World::rnum = u_get_num_random(10000-1));
len2 = u__snprintf(pbuffer2, 100, U_CONSTANT_TO_PARAM("%u\"}}"), World::rnum = u_get_num_random_range1(10000));
(void) es->sendPOST(es_buffer1, len1+U_CONSTANT_SIZE("/tfb/world/"), es_buffer2, len2+U_CONSTANT_SIZE("{\"doc\":{\"_id\":\""));
}

View File

@ -701,7 +701,7 @@ UString UServices::createToken(int alg)
U_TRACE(0, "UServices::createToken(%d)", alg)
UString output(80U);
uint32_t u = u_get_num_random(0);
uint32_t u = u_get_num_random();
u_dgst_init(alg, U_NULLPTR, 0);

View File

@ -593,7 +593,7 @@ bool UWebSocket::sendData(USocket* socket, int type, const char* data, uint32_t
UString tmp(ncount);
unsigned char* header = (unsigned char*)tmp.data();
*((uint32_t*)masking_key) = u_get_num_random(0);
*((uint32_t*)masking_key) = u_get_num_random();
switch (type)
{
@ -665,7 +665,7 @@ bool UWebSocket::sendControlFrame(USocket* socket, int opcode, const unsigned ch
UString tmp(ncount);
unsigned char* header = (unsigned char*)tmp.data();
*((uint32_t*)masking_key) = u_get_num_random(0);
*((uint32_t*)masking_key) = u_get_num_random();
header[0] = ( opcode | 0x80);
header[1] = (payload_length | 0x80);

View File

@ -1 +1 @@
0181
0188

View File

@ -32,7 +32,7 @@ static void usp_fork_db()
<!--#code
World::initOneResult();
World::pworld_query->id = World::rnumber[u_now->tv_usec % 500];
World::pworld_query->id = World::rnumber[0];
#ifdef U_STATIC_ORM_DRIVER_PGSQL
if (pdrv)

View File

@ -9,12 +9,21 @@ static void usp_fork_query() { World::handlerForkSql(); }
-->
<!--#header
-->
<!--#code
(void) World::pstmt_query->asyncPipelineMode(World::handlerResultSql);
<!--#vcode
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
/*
if (num_queries >= 20 &&
UServer_Base::startParallelization())
{
return;
}
*/
-->
<!--#code
World::initResult();
uint32_t num_queries = UHTTP::getFormFirstNumericValue(1, 500);
(void) World::pstmt_query->asyncPipelineMode(World::handlerResultSql);
for (uint32_t i = 0; i < num_queries; ++i)
{

View File

@ -51,7 +51,7 @@ if (UOrmDriver::isAsyncPipelineModeAvaliable() == false)
World::pstmt_query->execute();
World::pworld_query->randomNumber = u_get_num_random(10000-1);
World::pworld_query->randomNumber = u_get_num_random_range1(10000);
pstmt_update->execute();
@ -76,7 +76,7 @@ else
*pquery++ = ',';
pquery = u_num2str32(World::pworld_query->randomNumber = u_get_num_random(10000-1), pquery);
pquery = u_num2str32(World::pworld_query->randomNumber = u_get_num_random_range1(10000), pquery);
u_put_unalignedp16(pquery, U_MULTICHAR_CONSTANT16(')',','));
pquery += 2;

View File

@ -239,7 +239,7 @@ public:
{
U_TRACE_NO_PARAM(0, "World::handlerFork()")
if (rnumber[0] == 0) for (uint32_t i = 0; i < 500; ++i) rnumber[i] = u_get_num_random(10000-1);
if (rnumber[0] == 0) for (uint32_t i = 0; i < 500; ++i) rnumber[i] = u_get_num_random_range1(10000);
}
static void handlerForkSql()

View File

@ -75,11 +75,9 @@ public:
World::initOneResult();
uint32_t i = u_now->tv_usec % 500;
handlerQuery(World::rnumber[0]);
handlerQuery(World::rnumber[i]);
handlerOneResult(World::rnumber[i]);
handlerOneResult(World::rnumber[0]);
World::endOneResult();
}
@ -138,7 +136,7 @@ public:
# ifdef USE_MONGODB
(void) mc->findOne(World::rnumber[i], query);
(void) mc->update( World::rnumber[i], "randomNumber", World::rnum = u_get_num_random(10000-1));
(void) mc->update( World::rnumber[i], "randomNumber", World::rnum = u_get_num_random_range1(10000));
# endif
}
@ -206,7 +204,7 @@ public:
(void) rc->get(start, ptr-start);
*ptr = ' ';
ptr = u_num2str32(World::rnum = u_get_num_random(10000-1), ptr+1);
ptr = u_num2str32(World::rnum = u_get_num_random_range1(10000), ptr+1);
(void) rc->mset(start, ptr-start);
}
@ -262,7 +260,7 @@ public:
U_TRACE(0, "WorldNoSql::handlerUpdateElasticSearch(%u)", i)
uint32_t len1 = u__snprintf(pbuffer1, 100, U_CONSTANT_TO_PARAM("%u/_update"), World::rnumber[i]),
len2 = u__snprintf(pbuffer2, 100, U_CONSTANT_TO_PARAM("%u\"}}"), World::rnum = u_get_num_random(10000-1));
len2 = u__snprintf(pbuffer2, 100, U_CONSTANT_TO_PARAM("%u\"}}"), World::rnum = u_get_num_random_range1(10000));
(void) es->sendPOST(es_buffer1, len1+U_CONSTANT_SIZE("/tfb/world/"), es_buffer2, len2+U_CONSTANT_SIZE("{\"doc\":{\"_id\":\""));
}