mirror of
https://github.com/stefanocasazza/ULib.git
synced 2025-09-28 19:05:55 +08:00
sync
This commit is contained in:
parent
fd941c38c0
commit
b1094e9481
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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\":\""));
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -1 +1 @@
|
|||
0181
|
||||
0188
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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\":\""));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user