random: Optimize Randomizer::getBytesFromString() (#14894)

Co-authored-by: Tim Düsterhus <tim@bastelstu.be>
This commit is contained in:
Saki Takamachi 2024-07-20 22:42:47 +09:00 committed by GitHub
parent 68ae477796
commit 1fc2ddc996
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -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) {