PHP atsitiktinės eilutės generatorius

Bandau sukurti atsitiktinės atrankos eilutę PHP, ir aš visiškai negavau šio išvedimo:

 <?php function RandomString() { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randstring = ''; for ($i = 0; $i < 10; $i++) { $randstring = $characters[rand(0, strlen($characters))]; } return $randstring; } RandomString(); echo $randstring; 

Ką daryti neteisingai?

701
05 дек. Kapitono žaibo rinkinys 05 Dec 2010-12-05 01:56 '10 ne 1:56 2010-12-05 01:56
@ 50 atsakymų
  • 1
  • 2

Norint atsakyti į šį klausimą, reikia išspręsti dvi problemas:

  1. $randstring nėra taikymo sritis, kai esate $randstring .
  2. Simboliai nėra sujungti į kilpą.

Čia yra kodo fragmentas su taisymais:

 function generateRandomString($length = 10) { $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $charactersLength = strlen($characters); $randomString = ''; for ($i = 0; $i < $length; $i++) { $randomString .= $characters[rand(0, $charactersLength - 1)]; } return $randomString; } 

Spausdinkite atsitiktinę eilutę naudodami toliau nurodytą skambutį:

 // Echo the random string. // Optionally, you can give it a desired string length. echo generateRandomString(); 

Atkreipkite dėmesį, kad tai generuoja nuspėjamą atsitiktinę eilutę. Jei norite sukurti saugius raktus, žr. Šį atsakymą .

1231
05 дек. Stephen Watkins atsakymas gruodis 05 2010-12-05 01:57 '10 ne 1:57 2010-12-05 01:57

Pastaba: str_shuffle() viduje naudoja rand() , kuris netinka kriptografiniams tikslams (pavyzdžiui, generuojant atsitiktinius slaptažodžius). Vietoj to, norite saugaus atsitiktinių skaičių generatoriaus . Ji taip pat neleidžia kartoti simbolių.

Kitas būdas.

Atnaujinta (dabar ji sukuria bet kokią eilutės ilgį):

border=0
 function generateRandomString($length = 10) { return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length); } echo generateRandomString(); // OR: generateRandomString(24) 

Kas tai yra :) :)

337
03 нояб. atsakymas pateikiamas Pr07o7yp3 03 lapkričio. 2012-11-03 23:04 '12 at 23:04 2012-11-03 23:04

Yra daug atsakymų į šį klausimą, tačiau nė vienas iš jų nesinaudoja kriptografiškai saugiu pseudo-atsitiktinių skaičių generatoriumi (CSPRNG).

Paprastas, saugus ir teisingas atsakymas yra naudoti RandomLib ir ne išradinėti ratą.

Tiems iš jūsų, kurie primygtinai reikalauja sukurti savo sprendimą, PHP 7.0.0 šiam tikslui suteiks random_int() ; jei vis dar esate PHP 5.x, parašėme random_int() PHP 5 random_int() , kad galėtumėte naudoti naują API prieš pereinant prie PHP 7.

Saugiai generuoti atsitiktinius sveikus skaičius PHP nėra triviška užduotis. Prieš diegdami namų algoritmą gamyboje, visada turėtumėte pasitikrinti su „StackExchange“ kriptografijos specialistais .

Su patikimu sveikojo skaičiaus generatoriumi, sukuriant atsitiktinę eilutę su CSPRNG yra pėsčiomis parke.

Sukurkite saugią, atsitiktinę eilutę

  function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ') { $pieces = []; $max = mb_strlen($keyspace, '8bit') - 1; for ($i = 0; $i < $length; ++$i) { $pieces []= $keyspace[random_int(0, $max)]; } return implode('', $pieces); } 

Naudoti :

 $a = random_str(32); $b = random_str(8, 'abcdefghijklmnopqrstuvwxyz'); 

Demonstracija : https://3v4l.org/b4PST (ignoruoti PHP 5 klaidas, tam reikia atsitiktinio_kompato)

268
29 июня '15 в 6:41 2015-06-29 06:41 Atsakymą pateikė „ Scott Arciszewski “ birželio 15 d. 15:41 2015-06-29 06:41

Sukuria eilutės šešiakampį, kurio ilgis yra 20 simbolių:

 $string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars 

PHP 7 ( random_bytes () ):

 $string = base64_encode(random_bytes(10)); // ~14 chars, includes /=+ // or $string = substr(str_replace(['+', '/', '='], '', base64_encode(random_bytes(32))), 0, 32); // 32 chars, without /=+ // or $string = bin2hex(random_bytes(10)); // 20 chars, only 0-9a-f 
119
04 сент. Atsakymą pateikė Rudie 04 Sep. 2014-09-04 21:25 '14 21:25 2014-09-04 21:25

@tasmaniski: tavo atsakymas už mane. Turėjau tą pačią problemą, ir siūlau tai tiems, kurie ieško to paties atsakymo. Čia jis yra iš @tasmaniski:

 <?php $random = substr(md5(mt_rand()), 0, 7); echo $random; ?> 
80
10 февр. Atsakymas pateikiamas Humphrey 10 vasario mėn. 2013-02-10 11:24 '13, 11:24, 2013-02-10 11:24

Priklausomai nuo jūsų programos (norėjau sukurti slaptažodžius) galite naudoti

 $string = base64_encode(openssl_random_pseudo_bytes(30)); 

Būdami base64, jie gali turėti = arba - , taip pat prašomus simbolius. Galite sukurti ilgesnę eilutę, tada filtruoti ir apdailinti, kad juos pašalintumėte.

openssl_random_pseudo_bytes yra rekomenduojamas būdas sukurti teisingą atsitiktinį skaičių php. Kodėl rand nenaudoja /dev/random aš nežinau.

43
06 февр. atsakymas pateikiamas rjmunro 06 vasario mėn. 2013-02-06 20:40 '13, 08:40 pm 2013-02-06 20:40

Žinau, kad žaidimas gali būti šiek tiek vėlai, tačiau čia yra paprastas vienas eilutė, kuri sukuria tikrą atsitiktinę eilutę be jokių scenarijų lygio ciklų ar naudojant openssl bibliotekų.

 echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))),1,10); 

Norėdami išardyti, kad parametrai būtų aiškūs

 // Character List to Pick from $chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; // Minimum/Maximum times to repeat character List to seed from $chrRepeatMin = 1; // Minimum times to repeat the seed string $chrRepeatMax = 10; // Maximum times to repeat the seed string // Length of Random String returned $chrRandomLength = 10; // The ONE LINE random command with the above variables. echo substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin,$chrRepeatMax))),1,$chrRandomLength); 

Šis metodas veikia atsitiktinai pakartodamas simbolių sąrašą, po to susimaišo susietą eilutę ir grąžina nurodytų simbolių skaičių.

Galite pasirinktinai atsitiktinai suskirstyti atsitiktinę grąžintos eilutės ilgį, pakeisdami $chrRandomLength su mt_rand(8, 15) (8–15 simbolių atsitiktine eilute).

25
20 апр. Atsakymą pateikė Kraang Prime 20 balandžio. 2014-04-20 00:18 '14 ne 0:18 2014-04-20 00:18
 function generateRandomString($length = 15) { return substr(sha1(rand()), 0, $length); } 

Tada!

23
26 дек. Atsakymas duotas Davor 26 d. 2012-12-26 19:32 '12, 07:32 pm 2012-12-26 19:32

Geriausias būdas įgyvendinti šią funkciją:

 function RandomString($length) { $keys = array_merge(range(0,9), range('a', 'z')); $key = ""; for($i=0; $i < $length; $i++) { $key .= $keys[mt_rand(0, count($keys) - 1)]; } return $key; } echo RandomString(20); 

mt_rand yra labiau atsitiktinis pagal tai ir php7. rand funkcija yra mt_rand .

23
24 сент. Rathienth Baskaran atsakymas 24 rugsėjis. 2012-09-24 21:08 '12 21:08 2012-09-24 21:08

$randstring “ funkcijų srityje neatitinka srities, kurioje jį vadinate. Grįžtamąją vertę turite priskirti kintamajam.

 $randstring = RandomString(); echo $randstring; 

Arba tiesiog tiesioginio aido grąžinimo vertė:

 echo RandomString(); 

Be to, jūsų funkcija yra nedidelė. Naudodami „loop“, turite naudoti .= Kad kiekvienas simbolis būtų pridėtas prie eilutės. Naudojant = , vietoj to pridedate kiekvieną naują simbolį.

 $randstring .= $characters[rand(0, strlen($characters))]; 
19
05 дек. Atsakymas duotas BoltClock 05 gruodžio. 2010-12-05 01:59 '10 ne 1:59 2010-12-05 01:59

Pirmiausia nustatykite abėcėlę, kurią norite naudoti:

 $alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; $special = '~!@#$%^ $alphabet = $alphanum . $special; 

Tada naudokite openssl_random_pseudo_bytes() kad generuotumėte teisingus atsitiktinius duomenis:

 $len = 12; // length of password $random = openssl_random_pseudo_bytes($len); 

Galiausiai, naudodami šį atsitiktinį duomenų skaičių, sukuriate slaptažodį. Kadangi kiekvienas „ $random simbolis gali būti chr(0) į chr(255) , kodas naudoja likutį po to, kai dalijasi jo eilės reikšmę $alphabet_length , kad įsitikintumėte, jog pasirinktas tik simboliai iš abėcėlės (atkreipkite dėmesį, kad tai veda prie ):

 $alphabet_length = strlen($alphabet); $password = ''; for ($i = 0; $i < $len; ++$i) { $password .= $alphabet[ord($random[$i]) % $alphabet_length]; } 

Taip pat paprastai geriau naudoti „ RandomLib“ ir „ SecurityLib“ :

 use SecurityLib\Strength; $factory = new RandomLib\Factory; $generator = $factory->getGenerator(new Strength(Strength::MEDIUM)); $password = $generator->generateString(12, $alphabet); 
14
03 апр. Atsakymas iš Ja͢ck 03 Bal 2014-04-03 09:00 '14 ne 9:00 2014-04-03 09:00

Trumpi metodai.

Štai keletas trumpiausių atsitiktinės eilutės generavimo būdų.

 <?php echo $my_rand_strng = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), -15); echo substr(md5(rand()), 0, 7); echo str_shuffle(MD5(microtime())); ?> 
9
07 февр. Atsakymą pateikė Punit Gajjar 07 vasaris. 2017-02-07 09:12 '17 ne 9:12 2017-02-07 09:12

Aš išbandžiau populiariausių funkcijų atlikimą, laikas, per kurį reikia sukurti 1 000 000 tūkst.

 2.5 $s = substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,32); 1.9 $s = base64_encode(openssl_random_pseudo_bytes(24)); 1.68 $s = bin2hex(openssl_random_pseudo_bytes(16)); 0.63 $s = base64_encode(random_bytes(24)); 0.62 $s = bin2hex(random_bytes(16)); 0.37 $s = substr(md5(rand()), 0, 32); 0.37 $s = substr(md5(mt_rand()), 0, 32); 

Atkreipkite dėmesį, kad nesvarbu, kiek laiko jis iš tikrųjų buvo, bet lėčiau ir kuris iš jų yra greitesnis, todėl galite pasirinkti pagal savo reikalavimus, įskaitant kriptografinį pasirengimą ir tt

substr () aplink MD5 yra pridėtas siekiant tikslumo, jei jums reikia eilutės, kuri yra mažesnė nei 32 simboliai.

Atsakymas: eilutė nebuvo susieta, bet perrašyta, o funkcijos rezultatas nebuvo išsaugotas.

8
24 окт. Atsakymą pateikė Putnik spalio 24 d. 2017-10-24 15:09 '17, 13:09 pm 2017-10-24 15:09

Tai buvo paimta iš administratoriaus šaltinių :

  function rand_string() { return md5(uniqid(mt_rand(), true)); } 

„Adminer“ - duomenų bazės valdymo įrankis, parašytas PHP.

7
02 авг. naudotojo atsakymas 02 rug . 2016-08-02 06:15 '16 at 6:15 am 2016-08-02 06:15
 function rndStr($len = 64) { $randomData = file_get_contents('/dev/urandom', false, null, 0, $len) . uniqid(mt_rand(), true); $str = substr(str_replace(array('/','=','+'),'', base64_encode($randomData)),0,$len); return $str; } 
7
13 нояб. atsakymą pateikė Ruslanas Ibragimovas lapkričio 13 d 2012-11-13 17:45 '12 at 5:45 pm 2012-11-13 17:45

Vienas labai greitas būdas yra padaryti kažką panašaus:

 substr(md5(rand()),0,10); 

Tai sukurs atsitiktinę eilutę, kurios ilgis bus 10 simbolių. Žinoma, kai kurie gali pasakyti, kad skaičiavimo pusėje jis yra šiek tiek sunkesnis, tačiau šiuo metu procesoriai yra optimizuoti greitam „md5“ arba „sha256“ algoritmo paleidimui. Ir, žinoma, jei rand() funkcija grąžina tą pačią vertę, rezultatas bus tas pats, turint 1/32767 tikimybę būti vienodu. Jei tai saugumo problema, tiesiog pakeiskite „ rand() į mt_rand()

6
24 окт. atsakymą pateikė Akatosh spalio 24 d 2013-10-24 19:04 '13, 19:04, 2013-10-24 19:04

„Laravel 5“ struktūros pagalbinė funkcija

  function str_random($length = 16) { $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; return substr(str_shuffle(str_repeat($pool, $length)), 0, $length); } 
5
17 февр. Atsakymą pateikė Artnikpro vasario 17 d. 2015-02-17 22:03 '15, 10:03 val. 2015-02-17 22:03

Redaguota funkcija veikia gerai, tik viena problema, kurią radau: naudojote neteisingą simbolį, kad įtrauktumėte $ simbolius, todėl simbolis kartais yra atsitiktinės eilutės dalis.

Jei norite išspręsti šią problemą, pakeiskite:

 $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 

į

 $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 

Taigi naudojami tik uždari simboliai, o simbolis niekada nebus sukurtas atsitiktinės eilutės dalis.

4
08 авг. atsakymas pateikiamas bmcswee 08 rug . 2012-08-08 19:18 '12, 07:18 pm 2012-08-08 19:18

Kita viena eilutė, kuri generuoja atsitiktinę 10 simbolių eilutę su raidėmis ir skaičiais. Jis sukurs masyvą su range (sureguliuokite antrąjį parametrą, kad nustatytumėte dydį), sukoncentruokite šį masyvą ir priskirkite atsitiktinį ascii-char (diapazonas 0-9 arba az), tada sumaišykite matricą, kad gautumėte eilutę.

 $str = implode('', array_map(function () { return chr(rand(0, 1) ? rand(48, 57) : rand(97, 122)); }, range(0, 9))); 

Pastaba: veikia tik PHP 5.3 +

4
01 авг. atsakymą pateikė kasimiras 01 rug . 2014-08-01 17:20 '14, 17:20 2014-08-01 17:20

viena eilutė.
greitai pasižymi didelėmis linijomis, turinčiomis tam tikrą unikalumą.

 function random_string($length){ return substr(str_repeat(md5(rand()), ceil($length/32)), 0, $length); } 
4
19 мая '15 в 23:47 2015-05-19 23:47 atsakymą pateikė Jokūbo Smithas gegužės 19 d. 15, 23:47 2015-05-19 23:47
  function generateRandomString($length = 10, $abc = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") { return substr(str_shuffle($abc), 0, $length); } 

Šaltinis iš http://www.xeweb.net/2011/02/11/generate-a-random-string-az-0-9-in-php/

4
23 дек. atsakymas pateikiamas sxn 23 dec. 2017-12-23 13:57 '17 13:57 2017-12-23 13:57
 function randomString($length = 5) { return substr(str_shuffle(implode(array_merge(range('A','Z'), range('a','z'), range(0,9)))), 0, $length); } 
3
20 янв. atsakymą pateikė Anjith KP Jan 20 2017-01-20 19:35 '17 19:35 2017-01-20 19:35

Man patiko paskutinis komentaras, naudojamas openssl_random_pseudo_bytes, bet man tai nebuvo sprendimas, nes vis tiek turėjau ištrinti simbolius, kurių man nereikėjo, ir aš negalėjau gauti ilgio eilutės. Čia yra mano sprendimas ...

 function rndStr($len = 20) { $rnd=''; for($i=0;$i<$len;$i++) { do { $byte = openssl_random_pseudo_bytes(1); $asc = chr(base_convert(substr(bin2hex($byte),0,2),16,10)); } while(!ctype_alnum($asc)); $rnd .= $asc; } return $rnd; } 
3
11 февр. atsakymą pateikė RKaneKnight , vasario 11 d. 2013-02-11 00:02 '13 prie 0:02 2013-02-11 00:02

Yra paprastas kodas:

 echo implode("",array_map(create_function('$s','return substr($s,mt_rand(0,strlen($s)),1);'),array_fill(0,16,"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"))); 

Yra paprastas vadovas:

  • Norėdami pakeisti eilutės ilgį, pakeiskite 16 reikšmę į kitą vertę.
  • Norėdami pasirinkti iš skirtingų simbolių, pakeiskite simbolių eilutę.
2
02 авг. atsakymas duotas 16ctt1x 02 rug . 2016-08-02 18:21 '16 at 18:21 pm 2016-08-02 18:21

Tam yra geresnių alternatyvų, daugelis jau buvo paskelbti, taigi aš tik duosiu jums savo dalykus su taisymais

 <?php function RandomString() { global $randstring ; $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randstring = ''; for ($i = 0; $i < 10; $i++) { $randstring .= $characters[rand(0, strlen($characters))]; } return $randstring; } RandomString(); echo $randstring; ?> 

Galbūt jus domina:

 <?php function RandomString() { global $randstring ; $characters = str_split('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'); array_filter ($characters,function($var)use($characters, $randstring .= $characters[rand(0, count($characters)-1)]; }); return $randstring; } RandomString();echo $randstring.'<hr>'; //.. OR .. $randstring='';echo(RandomString()); ?> 

ar kitą:

 <?php function s($length){ for($i=0;($i<$length)and(($what=rand(1,3))and( (($what==1)and($t=rand(48,57) ))or (($what==2)and ($t=rand(65,90))) or (($what==3)and ($t=rand(97,122))) ) and (print chr($t)));$i++); } s(10); ?> 
2
02 янв. atsakymą pateikė Constantin 02 jan. 2018-01-02 19:13 '18, 19:13, 2018-01-02 19:13

Kitas būdas sukurti atsitiktines eilutes PHP :

 function RandomString($length) { $original_string = array_merge(range(0,9), range('a','z'), range('A', 'Z')); $original_string = implode("", $original_string); return substr(str_shuffle($original_string), 0, $length); } echo RandomString(6); 
2
19 окт. atsakymas suteiktas Akhilraj NS 19 okt. 2012-10-19 09:01 '12 at 9:01 am 2012-10-19 09:01

Parametruojamas vienos eilutės šriftas naudojant tik vietines PHP funkcijas, kurios veikia su PHP 5.1.0

 str_shuffle(implode('', (array_intersect_key(($map = array_map('chr', array_merge(array_map('mt_rand', array_fill(0, $length = 25, 48), array_fill(0,$length,57)),array_map('mt_rand', array_fill(0, $length, 65), array_fill(0,$length,90)),array_map('mt_rand', array_fill(0, $length, 97), array_fill(0,$length,122))))), array_flip($keys = array_rand($map, $length)))))) 
1
22 нояб. atsakymą pateikė vartotojo10099 lapkritis 22 2017-11-22 04:46 '17 at 4:46 2017-11-22 04:46

Galiausiai aš suradau sprendimą, kaip gauti atsitiktinę ir unikalią mano sprendimo vertę.

 substr(md5(time()), 0, 12) 

laikas visada grįžta į laiko žymę ir visada yra unikalus. Ją galite naudoti su md5, kad jis būtų geresnis.

1
22 мая '17 в 12:21 2017-05-22 12:21 Atsakymą pateikė Muhammad Junaid Aslam , gegužės 22 d., 12:21, 00-22 12:21
 function getRandomString($length) { $salt = array_merge(range('a', 'z'), range(0, 9)); $maxIndex = count($salt) - 1; $result = ''; for ($i = 0; $i < $length; $i++) { $index = mt_rand(0, $maxIndex); $result .= $salt[$index]; } return $result } 
1
02 окт. atsakymą pateikė Ryan Williams 02 okt. 2013-10-02 03:10 '13, 3:10 2013-10-02 03:10

Tai darote visiškai neteisingai, nes priklauso nuo numerių, o ne simbolių, ir nesu įsitikinęs, ar norite, kad atsitiktinis išėjimas būtų tik numeris, jei taip, kodėl jums reikia gauti visas raides ir raides ir spausdinti jų ilgį? kodėl gi ne tik naudojote rand(0, 62) net jei pamiršote inicijuoti savo $randstring kintamąjį prieš deklaruodami šią funkciją.

PHP vistiek siūlo jums labai patogią funkciją šiam tikslui str_shuffle() . Štai jums tinkamas pavyzdys.

1
14 мая '17 в 0:07 2017-05-14 00:07 atsakymą pateikė Wael Assaf gegužės 14 d. 17 d
  • 1
  • 2

Kiti klausimai apie žymes arba Ask a question