Skip to content

Commit d12b519

Browse files
committed
fix mt seed
1 parent 928c340 commit d12b519

File tree

1 file changed

+19
-20
lines changed

1 file changed

+19
-20
lines changed

ext/random/random.c

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,23 @@ static inline void mersennetwister_reload(php_random_engine_state_mersennetwiste
575575
state->cnt = 0;
576576
}
577577

578+
static void mersennetwister_seed(void *state, const uint64_t seed) {
579+
/* Initialize generator state with seed
580+
See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier.
581+
In previous versions, most significant bits (MSBs) of the seed affect
582+
only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto. */
583+
php_random_engine_state_mersennetwister *s = state;
584+
585+
s->s[0] = seed & 0xffffffffU;
586+
for (s->cnt = 1; s->cnt < MT_N; s->cnt++) {
587+
s->s[s->cnt] = (1812433253U * (s->s[s->cnt - 1] ^ (s->s[s->cnt - 1] >> 30)) + s->cnt) & 0xffffffffU;
588+
}
589+
mersennetwister_reload(s);
590+
591+
/* Seed only once */
592+
s->seeded = true;
593+
}
594+
578595
static uint64_t mersennetwister_generate(void *state, bool *engine_unsafe) {
579596
php_random_engine_state_mersennetwister *s = state;
580597
uint32_t s1;
@@ -584,10 +601,9 @@ static uint64_t mersennetwister_generate(void *state, bool *engine_unsafe) {
584601
if (php_random_bytes_silent(&bytes, sizeof(zend_long)) == FAILURE) {
585602
bytes = GENERATE_SEED();
586603
}
587-
php_mt_srand(bytes);
604+
mersennetwister_seed(state, bytes);
588605
}
589606

590-
591607
if (s->cnt >= MT_N) {
592608
mersennetwister_reload(s);
593609
}
@@ -599,23 +615,6 @@ static uint64_t mersennetwister_generate(void *state, bool *engine_unsafe) {
599615
return (uint64_t) (s1 ^ (s1 >> 18));
600616
}
601617

602-
static void mersennetwister_seed(void *state, const uint64_t seed) {
603-
/* Initialize generator state with seed
604-
See Knuth TAOCP Vol 2, 3rd Ed, p.106 for multiplier.
605-
In previous versions, most significant bits (MSBs) of the seed affect
606-
only MSBs of the state array. Modified 9 Jan 2002 by Makoto Matsumoto. */
607-
php_random_engine_state_mersennetwister *s = state;
608-
609-
s->s[0] = seed & 0xffffffffU;
610-
for (s->cnt = 1; s->cnt < MT_N; s->cnt++) {
611-
s->s[s->cnt] = (1812433253U * (s->s[s->cnt - 1] ^ (s->s[s->cnt - 1] >> 30)) + s->cnt) & 0xffffffffU;
612-
}
613-
mersennetwister_reload(s);
614-
615-
/* Seed only once */
616-
s->seeded = true;
617-
}
618-
619618
static int mersennetwister_serialize(void *state, HashTable *data) {
620619
php_random_engine_state_mersennetwister *s = state;
621620
zval tmp;
@@ -1761,7 +1760,7 @@ PHP_METHOD(Random_Engine_Xoshiro256StarStar, __construct)
17611760
PHP_METHOD(Random_Engine_Xoshiro256StarStar, jump)
17621761
{
17631762
php_random_engine *engine = Z_RANDOM_ENGINE_P(ZEND_THIS);
1764-
php_random_engine_state_xoshiro256starstar *s = (php_random_engine_state_xoshiro256starstar *) engine->state;
1763+
php_random_engine_state_xoshiro256starstar *s = engine->state;
17651764
static const uint64_t jmp[] = { 0x180ec6d33cfd0aba, 0xd5a61266f0c9392c, 0xa9582618e03fc9aa, 0x39abdc4529b1661c };
17661765
uint64_t s0 = 0, s1 = 0, s2 = 0, s3 = 0;
17671766
int i, j;

0 commit comments

Comments
 (0)