Según PHP 7.2.7 fuentes , La función str_shuffle
utiliza php_string_shuffle
que hace
while (--n_left) {
rnd_idx = php_rand();
RAND_RANGE(rnd_idx, 0, n_left, PHP_RAND_MAX);
if (rnd_idx != n_left) {
temp = str[n_left];
str[n_left] = str[rnd_idx];
str[rnd_idx] = temp;
}
}
Supongo que le gustaría saber los valores intermedios de rnd_idx
(ya que php_rand()
es un alias de php_mt_rand()
).
Pero RAND_RANGE
es una macro definida como #define RAND_RANGE(__n, __min, __max, __tmax) (__n) = php_mt_rand_range((__min), (__max))
por lo que el primer valor del php_rand()
ya se pierde instantáneamente.
Por lo tanto, no obtendrá la lista de todos los valores de mt_range()
intermedios.
Aún así, sabiendo que el algoritmo parece ser at each round, swap the current letter with a random letter before in the input string; the 1st round takes the last letter as the current one; the next round takes the letter previous current letter as the new current letter
, entonces puede obtener el valor mt_rand
al razonar hacia atrás.
Si ABCD
es el valor de entrada y BADC
es el resultado, entonces significa que los valores fueron 2;2;0
( ABCD
= > ABDC
= > ABDC
= > BADC
) pero aún no sabe el valor de las llamadas "perdidas" a php_mt_rand
. Así que la secuencia de mt_rand
fue en realidad ?;2;?;2;?;0
que coincide con la semilla 4
y 25
: si lo hace mt_srand(4); echo str_shuffle('ABCD');
, obtendrá BADC
e igual si su semilla se establece en 25
. Necesitarías una cadena bastante larga de caracteres únicos para obtener una secuencia lo suficientemente larga como para que coincida solo con una semilla.