PHP:
Satunnaislukujen generointi
Miten:
PHP tarjoaa useita toimintoja satunnaisten numeroiden generoimiseen, mutta yleisimmin käytetyt ovat rand()
, mt_rand()
ja kryptografisiin tarkoituksiin random_int()
.
Yksinkertaisen satunnaisluvun generoimiseksi välillä 0 ja getrandmax() (suurin mahdollinen arvo, jonka rand()
voi palauttaa), voit käyttää:
echo rand();
Tarkemmalle välille, kuten 1:n ja 100:n välille:
echo rand(1, 100);
mt_rand()
on kuitenkin parempi valinta nopeuden ja satunnaisuuden kannalta:
echo mt_rand(1, 100);
Tuloksena molemmissa voisi olla mikä tahansa luku 1:n ja 100:n välillä satunnaistamisen mukaan, esim., 42
.
Kryptografisissa tai turvallisuuskonteksteissa, missä ennalta-arvaamattomuus on olennaista, random_int()
on suositeltava valinta, sillä se luo kryptografisesti turvallisia pseudo-satunnaislukuja:
echo random_int(1, 100);
Jälleen, tuloksena on satunnainen luku 1:n ja 100:n välillä, kuten 84
, mutta vahvemmalla satunnaisuuden takeella.
Syväsukellus
rand()
-funktio on ollut osa PHP:ta sen alkuaikoina, toimien alkuperäisenä menetelmänä satunnaisten numeroiden generoimiseen. Se ei kuitenkaan ole paras vaihtoehto sovelluksille, jotka vaativat korkeaa satunnaisuuden astetta sen suhteellisen ennustettavan algoritmin vuoksi.
mt_rand()
, joka esiteltiin PHP 4:ssä, perustuu Mersenne Twister -algoritmiin - se on huomattavasti parempi nopeuden ja sen kyvyn tuottaa satunnaisuutta verrattuna rand()
-funktioon. Se nousi nopeasti suosituksi vaihtoehdoksi useimmille ei-kryptografisille tarpeille.
Turvallisuusherkissä sovelluksissa, random_int()
esiteltiin PHP 7:ssä tuottamaan kryptografisesti turvallisia pseudo-satunnaislukuja käyttäen järjestelmän satunnaislukugeneraattorin satunnaisia tavuja. Se on huomattavasti turvallisempi kuin rand()
tai mt_rand()
, tehden siitä parhaan valinnan tokenien, avainten tai muiden elementtien generoimiseen, joissa ennustettavuus voisi johtaa turvallisuusriskeihin.
Huolimatta näistä parannuksista, on ratkaisevan tärkeää valita oikea funktio sovelluksen kontekstin perusteella. Yleiskäyttöön mt_rand()
riittää, mutta mihin tahansa, joka voitaisiin kohdentaa tai hyväksikäyttää, random_int()
on oikea valinta, tarjoten sekä satunnaisuutta että turvallisuutta.