Skip to content

Commit d9e15c5

Browse files
committed
optimize Randomizer::getBytes
1 parent 360fae2 commit d9e15c5

File tree

2 files changed

+17
-27
lines changed

2 files changed

+17
-27
lines changed

ext/random/random.c

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ static uint32_t rand_range32(const php_random_engine_algo *algo, void *state, ui
160160
size_t generated_size;
161161

162162
RANDOM_ENGINE_GENERATE_SIZE(algo, state, result, generated_size);
163-
164163
while (generated_size < sizeof(uint32_t)) {
165164
uint32_t ret;
166165
size_t generate_size;
@@ -624,6 +623,7 @@ static uint64_t user_generate(void *state) {
624623
size_t size;
625624
zval retval;
626625
int i;
626+
char *ptr;
627627

628628
zend_call_known_instance_method_with_0_params(s->generate_method, s->object, &retval);
629629

@@ -632,7 +632,7 @@ static uint64_t user_generate(void *state) {
632632
s->last_generate_size = size;
633633

634634
/* Endianness safe copy */
635-
char *ptr = (char *) &result;
635+
ptr = (char *) &result;
636636
for (i = 0; i < size; i++) {
637637
ptr[i] = Z_STR(retval)->val[i];
638638
}
@@ -1213,7 +1213,7 @@ PHP_METHOD(Random_Engine_XorShift128Plus, generate)
12131213

12141214
/* Endianness safe copy */
12151215
for (i = 0; i < size; i++) {
1216-
bytes->val[i] = (generated >> (i * 8)) & 0xff;
1216+
ZSTR_VAL(bytes)[i] = (generated >> (i * 8)) & 0xff;
12171217
}
12181218

12191219
ZSTR_VAL(bytes)[size] = '\0';
@@ -1416,11 +1416,9 @@ PHP_METHOD(Random_Randomizer, getInt)
14161416
PHP_METHOD(Random_Randomizer, getBytes)
14171417
{
14181418
php_random_randomizer *randomizer = Z_RANDOM_RANDOMIZER_P(ZEND_THIS);
1419-
zend_string *ret;
1419+
zend_string *retval;
14201420
zend_long length;
1421-
uint64_t buf;
1422-
char *bytes;
1423-
size_t generated_bytes = 0;
1421+
size_t generated_size = 0;
14241422
int i;
14251423

14261424
ZEND_PARSE_PARAMETERS_START(1, 1)
@@ -1432,31 +1430,22 @@ PHP_METHOD(Random_Randomizer, getBytes)
14321430
RETURN_THROWS();
14331431
}
14341432

1435-
ret = zend_string_alloc(length, 0);
1433+
retval = zend_string_alloc(length, 0);
14361434

1437-
while (generated_bytes <= length) {
1438-
size_t generated_size = randomizer->algo->dynamic_generate_size(randomizer->state);
1439-
1440-
buf = randomizer->algo->generate(randomizer->state);
1441-
while (generated_size < sizeof(uint64_t)) {
1442-
size_t generate_size = randomizer->algo->dynamic_generate_size(randomizer->state);
1435+
while (generated_size < (length * sizeof(char))) {
1436+
uint64_t generated;
1437+
size_t generate_size;
14431438

1444-
buf = (buf << generate_size) | randomizer->algo->generate(randomizer->state);
1439+
RANDOM_ENGINE_GENERATE_SIZE(randomizer->algo, randomizer->state, generated, generate_size);
14451440

1446-
generated_size += generate_size;
1441+
for (i = 0; i < generate_size; i++) {
1442+
ZSTR_VAL(retval)[i] = (generated >> (i * 8)) & 0xff;
14471443
}
14481444

1449-
bytes = (char *) &buf;
1450-
for (i = 0; i < (sizeof(uint64_t) / sizeof(char)); i ++) {
1451-
ZSTR_VAL(ret)[generated_bytes + i] = bytes[i];
1452-
1453-
if ((generated_bytes + i) >= length) {
1454-
ZSTR_VAL(ret)[length] = '\0';
1455-
RETURN_STR(ret);
1456-
}
1457-
}
1458-
generated_bytes += (sizeof(uint64_t) / sizeof(char));
1445+
generated_size += generate_size;
14591446
}
1447+
ZSTR_VAL(retval)[length] = '\0';
1448+
RETURN_STR(retval);
14601449
}
14611450
/* }}} */
14621451

ext/random/tests/randomizer/basic.phpt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ foreach ($engines as $engine) {
3737

3838
// getBytes
3939
for ($i = 0; $i < 1000; $i++) {
40-
if (\strlen($randomizer->getBytes(1024)) !== 1024) {
40+
$length = \random_int(1, 1024);
41+
if (\strlen($randomizer->getBytes($length)) !== $length) {
4142
die($engine::class . ': getBytes: failure.');
4243
}
4344
}

0 commit comments

Comments
 (0)