Skip to content

Commit 1fc2ddc

Browse files
random: Optimize Randomizer::getBytesFromString() (php#14894)
Co-authored-by: Tim Düsterhus <tim@bastelstu.be>
1 parent 68ae477 commit 1fc2ddc

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

ext/random/randomizer.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,8 @@ PHP_METHOD(Random_Randomizer, getBytesFromString)
431431
mask |= mask >> 1;
432432
mask |= mask >> 2;
433433
mask |= mask >> 4;
434+
// Expand the lowest byte into all bytes.
435+
mask *= 0x0101010101010101;
434436

435437
int failures = 0;
436438
while (total_size < length) {
@@ -440,8 +442,10 @@ PHP_METHOD(Random_Randomizer, getBytesFromString)
440442
RETURN_THROWS();
441443
}
442444

445+
uint64_t offsets = result.result & mask;
443446
for (size_t i = 0; i < result.size; i++) {
444-
uint64_t offset = (result.result >> (i * 8)) & mask;
447+
uint64_t offset = offsets & 0xff;
448+
offsets >>= 8;
445449

446450
if (offset > max_offset) {
447451
if (++failures > PHP_RANDOM_RANGE_ATTEMPTS) {

0 commit comments

Comments
 (0)