From 1fc2ddc9966ab0951183db22ae140a8ee2691401 Mon Sep 17 00:00:00 2001 From: Saki Takamachi <34942839+SakiTakamachi@users.noreply.github.com> Date: Sat, 20 Jul 2024 22:42:47 +0900 Subject: [PATCH] random: Optimize `Randomizer::getBytesFromString()` (#14894) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Tim Düsterhus --- ext/random/randomizer.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ext/random/randomizer.c b/ext/random/randomizer.c index 9d0545eefe4..76ff5bf590a 100644 --- a/ext/random/randomizer.c +++ b/ext/random/randomizer.c @@ -431,6 +431,8 @@ PHP_METHOD(Random_Randomizer, getBytesFromString) mask |= mask >> 1; mask |= mask >> 2; mask |= mask >> 4; + // Expand the lowest byte into all bytes. + mask *= 0x0101010101010101; int failures = 0; while (total_size < length) { @@ -440,8 +442,10 @@ PHP_METHOD(Random_Randomizer, getBytesFromString) RETURN_THROWS(); } + uint64_t offsets = result.result & mask; for (size_t i = 0; i < result.size; i++) { - uint64_t offset = (result.result >> (i * 8)) & mask; + uint64_t offset = offsets & 0xff; + offsets >>= 8; if (offset > max_offset) { if (++failures > PHP_RANDOM_RANGE_ATTEMPTS) {