On Tue, Jan 5, 2021 at 6:40 PM Go Kudo <zeriyo...@gmail.com> wrote:

> Thanks Nikita.
>
> Thanks for the input. This looks like a very smart solution.
> I've edited the RFC and added a new proposal as TypeC.
>
> https://wiki.php.net/rfc/object_scope_prng
>

In addition to the functions you already list, I'd add

    function rng_bytes(RNGInterface $rng, int $length): string;
    function rng_between(RNGInterface $rng, int $min, int $max): int;

Similar to your type B proposal.

Just to share another possibility, we could also modify existing functions
to optionally accept RNGInterface, like

    shuffle(array &$array, ?RNGInterface $rng = null): bool;

However, I'm not sure this is better than adding a separate family of
functions.


> However, I have a couple of concerns. The first is that users will have to
> be careful with RNG instances (for better or worse, TypeA will not allow
> users to use unintended instances), and the second is that it will
> complicate the implementation of PHP functions.
>

What do you mean by "use unintended instances" here?

Regarding implementation complexity, yes, this version is a bit more
involved if we want to allow userland implementations of RNGInterface. To
be honest I don't particularly care about supporting userland (we could
also only allow it to be implemented internally), but I think it shouldn't
be too hard either.


> Also, given the current environment in which PHP runs, I think that random
> number generation in the 64bit range should be supported.
> How about including the `next64()` method in the interface?
>

This is generally the part I'm least sure about. I agree that it would be
good to leverage 64-bit numbers on systems that support them. On the other
hand, I also think that having a consistent random number stream between
32-bit and 64-bit systems may be important. For example, if you use this
functionality for predictable "randomness" in unit tests, then it would be
a problem if your library could only be tested on 32-bit or only on 64-bit.

As long as an API like rng_between($rng, $min, $max) is used, we can always
assemble two 32-bit values into a random number that is larger than 32-bit.
But of course, fetching a single 64-bit number is more efficient...

Nikita


> 2021年1月5日(火) 23:53 Nikita Popov <nikita....@gmail.com>:
>
>> On Thu, Dec 24, 2020 at 5:12 PM zeriyoshi <zeriyo...@gmail.com> wrote:
>>
>>> I updated the RFC draft and changed it to a proposal to bifurcate the
>>> interface.
>>>
>>> https://wiki.php.net/rfc/object_scope_prng
>>>
>>> At the same time, I was looking into the RNG problem in Swoole and found
>>> out that the problem was actually occurring.
>>>
>>> https://www.easyswoole.com/En/Other/random.html
>>>
>>> The above problem with Swoole is only for child processes and can be
>>> fixed
>>> by the user, but as mentioned above, I think it will become more serious
>>> as
>>> PHP becomes more complex in the future.
>>> I hadn't thought of this before, but we might want to consider
>>> deprecating
>>> existing state-dependent RNG functions.
>>>
>>> I am seeking feedback on this proposal in order to take the RFC to the
>>> next
>>> step.
>>> Thank you in advance.
>>>
>>> Regards,
>>> Go Kudo
>>>
>>
>> I think the general direction of your second proposal (B) is the right
>> one, but I'm concerned about some of the details.
>>
>> First and foremost, I don't think that RNG should extend Iterator. Just
>> having a single "next()" method or similar is sufficient. The Iterator
>> interface provides many additional things that don't really make sense in
>> this context and only complicate the implementation. We should clearly
>> specify the value range of next() though. I assume that for portability
>> reasons (ensure same sequence on 32-bit and 64-bit) this would have to be a
>> sign-extended 32-bit value.
>>
>> The type B proposal distinguishes between a RNG and a PRNG interface. Is
>> this really useful? I don't think the value of the "getSeed()" method is
>> high enough to justify the split interface.
>>
>> The RNGUtil class has methods like:
>>
>>     public static function shuffleArray(int $randomNumber, array $arr):
>> array;
>>
>> This doesn't make sense to me, as a single random number is not enough to
>> shuffle a whole array :) Instead this should be accepting the RNG and
>> perform an internal call to next() (of course, with a fast by-pass
>> mechanism if the RNG is implemented internally):
>>
>>     public static function shuffleArray(RNG $rng, array $arr): array;
>>
>> I'm also wondering why this is a static class rather than a set of
>> free-standing functions. Why RNGUtil::shuffleArray() rather than
>> rng_shuffle_array()?
>>
>> Regards,
>> Nikita
>>
>> 2020年12月16日(水) 23:46 zeriyoshi <zeriyo...@gmail.com>:
>>>
>>> > Nice to meet you, internals.
>>> >
>>> > PHP 8.0 has been released. With the inclusion of JIT, PHP is about to
>>> be
>>> > extended beyond the web.
>>> >
>>> > So I'd like to make a few suggestions.
>>> >
>>> > First , PHP has the historical Mersenne Twister PRNG. However, this
>>> > implementation keeps its state in a global and cannot be handled as an
>>> > object like other languages (e.g. Java).
>>> >
>>> > So, I created a PHP Extension and proposed it to PECL.
>>> >
>>> > https://marc.info/?l=pecl-dev&m=160795415604102&w=2
>>> > https://github.com/zeriyoshi/php-ext-orng
>>> >
>>> > But, Then I looked at the mailing list archives and noticed that a
>>> similar
>>> > proposal had been made before.
>>> >
>>> > https://externals.io/message/98021#98130
>>> >
>>> > I feel that this suggestion is needed now to expand PHP beyond the web.
>>> >
>>> > Second suggestion is to stop using the Combined LCG as the default seed
>>> > value for each function.
>>> >
>>> > PHP's Combined LCG only uses PID (or ZTS Thread ID) and time as
>>> entropy.
>>> > https://github.com/php/php-src/blob/master/ext/standard/lcg.c#L72
>>> >
>>> > With the development of container technology, this problem seems to be
>>> > getting more serious. So I think we should use the random numbers
>>> provided
>>> > by the OS (getrandom on Linux) if available.
>>> >
>>> > I would like to hear your opinions.
>>> >
>>> > Regards
>>> > Go Kudo <zeriyo...@gmail.com>
>>> >
>>>
>>

Reply via email to