PHP təsadüfi magistr generatoru

PHP-də təsadüfi bir sətir yaratmaq üçün çalışıram və bununla heç bir nəticə vermirəm:

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

Yanlış etdiyim nədir?

673
05 дек. Kapitan Şimşək 05 Dek 2010-12-05 01:56 '10 'da 1:56' de 2010-12-05 01:56
@ 47 cavab
  • 1
  • 2

Bu məsələyə xüsusi olaraq cavab vermək üçün iki problem var:

  • $randstring həcminə daxil edilmir.
  • Rəmzlər bir döngədə birləşdirilmir.

Düzəlişləri olan kod pasajı:

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

Aşağıdakı zəng ilə təsadüfi bir xətt çap:

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

Bu proqnozlaşdırıla bilən təsadüfi strings yaradır unutmayın. Təhlükəsiz istinadlar yaratmaq istəyirsinizsə, bu cavabı baxın .

1177
05 дек. Stephen Watkins tərəfindən verilmiş cavab 05 dekabr 2010-12-05 01:57 '10 at 1:57 2010-12-05 01:57

Qeyd: str_shuffle() daxili olaraq kriptoqrafiya məqsədləri üçün uyğun olmayan rand() istifadə edir (məsələn, təsadüfi parol yaradır). Bunun əvəzinə təhlükəsiz bir təsadüfi saylı generator istənirsiniz . Həmçinin təkrarlanan simvollara icazə vermir.

Başqa bir yol.

YENİLƏNİB (indi hər hansı bir string uzunluğu yaradır):

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) 

Nədir? :)

326
03 нояб. Cavab Pr07o7yp3 03 noyabrda verilir. 2012-11-03 23:04 '12 at 23:04 2012-11-03 23:04

Bu suala bir çox cavab var, lakin onların heç biri kriptoqrafik cəhətdən təhlükəsiz sözdə təsadüfi sayda generatoru (CSPRNG) istifadə edir.

Sadə, təhlükəsiz və düzgün cavab RandomLib istifadə etmək və təkər təkrarlamaq deyil.

Öz həllinizi yaratmaqda israrlı olanlarınız üçün PHP 7.0.0 bu məqsəd üçün random_int() təmin edəcək; PHP 5- də hələ də PHP 5-PHP 5-də random_int() . PHP 7-ə keçməzdən əvvəl yeni API istifadə edə bilərsiniz.

PHP-də təsadüfi tam ədədləri təhlükəsiz şəkildə yaratmaq çətin bir məsələ deyil. Evinizdə alqoritminizi yerləşdirmədən əvvəl həmişə StackExchange kriptoqrafik mütəxəssislərinizlə əlaqə saxlamalısınız.

Etibarlı bir tamsaylı generator ilə, CSPRNG ilə təsadüfi bir simli yaratmaq parkda gəzintidir.

Təhlükəsiz, təsadüfi bir simli yaradın

  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); } 

İstifadə edin :

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

Demo : https://3v4l.org/b4PST (PHP 5 səhvlərini məhdudlaşdırmaq, bu random_compat tələb edir)

248
29 июня '15 в 6:41 2015-06-29 06:41 Cavab Scott Arciszewski tərəfindən 29 iyun 'da 6:41' də verilir. 2015-06-29 06:41

Uzunluğu 20x uzunluqda bir hex simli yaradır:

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

PHP 7'de (random_bytes () ):

 $string = base64_encode(random_bytes(10)); // ~14 chars // or $string = bin2hex(random_bytes(10)); // 20 chars 
110
04 сент. Cavab Rudie 04 Sep tərəfindən verilir. 2014-09-04 21:25 '14 at 21:25 2014-09-04 21:25

@tasmaniski: Sizin cavabınız mənim üçün işləmişdir. Eyni problemim vardı və eyni cavabı axtarır olanlara təklif edirəm. Burada @ tasmaniski:

 <?php $random = substr(md5(mt_rand()), 0, 7); echo $random; ?> 
75
10 февр. Cavab Humphrey 10 fevralda verilir. 2013-02-10 11:24 '13 'da 11:24' də 2013-02-10 11:24

Başvurunuza bağlı olaraq (şifreler yaratmaq istedim) istifadə edə bilərsiniz

 $string = base64_encode(openssl_random_pseudo_bytes(30)); 

Base64 olmağına, onlar istənilən simvolların yanaşı = və ya - , və ya ola bilər. Daha uzun bir dize yaratmaq, sonra silmək və onları çıxarmaq üçün düzəltmək olar.

openssl_random_pseudo_bytes php-də düzgün təsadüfi sayını yaratmaq üçün tövsiyə edilən üsuldur. Niyə rand istifadə etməz /dev/random bilmirəm.

43
06 февр. Cavab rjmunro verildi 06 Fevral. 2013-02-06 20:40 '13 saat 20:40 'da 2013-02-06 20:40

Bu oyun üçün bir az gec ola biləcəyini bilirəm amma burada hər hansı bir skript səviyyəsi səviyyəsindən və ya openssl kitabxanalarından istifadə etməklə əsl təsadüfi bir simli yaradan sadə bir line var.

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

Parametrlər aydın olduğu üçün onu qırmaq üçün

 // 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); 

Bu üsul təsadüfi bir simvol siyahısını təkrarlayaraq işləyir, sonra birləşdirilmiş simli qarışdırır və göstərilən simvolların sayını qaytarır.

$chrRandomLength mt_rand(8, 15) (8 ilə 15 simvol təsadüfi bir simli üçün mt_rand(8, 15) ilə $chrRandomLength əvəzləşdirən, geri qaytarılmış simli uzunluğunu randomize edərək seçə bilərsiniz.

25
20 апр. Cavab Kraang Prime 20 apr tərəfindən verilir . 2014-04-20 00:18 '14 'də 0:18 2014-04-20 00:18

Bu xüsusiyyəti tətbiq etmək üçün ən yaxşı yol:

 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 bubuna uyğun olaraq daha təsadüfidir. rand funksiyası mt_rand bir mt_rand .

23
24 сент. Rathienth Baskaran tərəfindən verilib cavab 24 Sep. 2012-09-24 21:08 '12 at 21:08 2012-09-24 21:08
 function generateRandomString($length = 15) { return substr(sha1(rand()), 0, $length); } 

Tada!

21
26 дек. Cavab Davor 26 dekabr verilir. 2012-12-26 19:32 '12 saat 19:32 'da 2012-12-26 19:32

Funksiya sahəsindəki $randstring , onu zəng etdiyiniz sahəyə uyğun deyil. Dönüş dəyəri bir dəyişənə təyin etməlisiniz.

 $randstring = RandomString(); echo $randstring; 

Və ya birbaşa yankı dönüş dəyəri:

 echo RandomString(); 

Bundan əlavə, funksiyasında kiçik bir səhv var. Döngə üçün, istifadə etməlisiniz .= Hər bir simvol bir simliya əlavə olunur. = İstifadə edərək, əlavə etmək əvəzinə hər yeni simvolu ilə əvəz edəsiniz.

 $randstring .= $characters[rand(0, strlen($characters))]; 
19
05 дек. Cavab BoltClock verilir 05 dekabr. 2010-12-05 01:59 '10 at 1:59 2010-12-05 01:59

Əvvəlcə istifadə etmək istədiyiniz əlifbanı müəyyənləşdirin:

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

Doğru təsadüfi məlumatların yaranması üçün openssl_random_pseudo_bytes() istifadə edin:

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

Nəhayət, parol yaratmaq üçün bu təsadüfi məlumatlardan istifadə edirsiniz. Hər bir xarakter $random olaraq chr(0) -dan chr(255) ola bilər, çünki kod sıradan dəyərini $alphabet_length ilə bölüşdürdükdən sonra istifadə edir, yalnız əlifbadan olan simvolların seçildiyinə əmin olmaq üçün ):

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

Alternativ olaraq, adətən RandomLibSecurityLib istifadə etmək daha yaxşıdır:

 use SecurityLib\Strength; $factory = new RandomLib\Factory; $generator = $factory->getGenerator(new Strength(Strength::MEDIUM)); $password = $generator->generateString(12, $alphabet); 
14
03 апр. Ja͢ck- dən cavab 03 Apr 2014-04-03 09:00 '14 saat 09:00 'da 2014-04-03 09:00

Qısa metodlar.

Burada təsadüfi bir simli yarada biləcək ən qısa üsullardan bəziləri.

 <?php echo $my_rand_strng = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), -15); echo substr(md5(rand()), 0, 7); echo str_shuffle(MD5(microtime())); ?> 
9
07 февр. Cavab Punit Gajjar tərəfindən verilir 07 fevral. 2017-02-07 09:12 '17 'da 9:12' də 2017-02-07 09:12 'də

Mənim ən çox gələn populyar xüsusiyyətlərin performansını test etdiyim, gələn qutuda 1'000'000 satır 32 simvol yaratmaq üçün lazım olan vaxt:

 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); 

Xatırlayın ki, əslində nə qədər uzun olsa da, daha yavaş və daha sürətli olduğu üçün, tələblərinizə uyğun olaraq, kriptoqrafik hazırlığı da daxil olmaqla, seçə bilərsiniz.

MD5 ətrafında substr (), 32 simvoldan az olan bir dize ehtiyac duyarsınızsa, dəqiqliyi əldə etmək üçün əlavə olunmuşdur.

Cavab üçün: simli birləşmə deyil, yazıldı və funksiyanın nəticəsi saxlanmadı.

8
24 окт. Cavab 24 oktyabrda Putnik tərəfindən verilir . 2017-10-24 15:09 '17 at 3:09 pm 2017-10-24 15:09
 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 нояб. Cavab Ruslan İbragimov tərəfindən 13 noyabrda verilir 2012-11-13 17:45 '12 'də saat 17 : 45-da 2012-11-13 17:45

Bu, admin mənbələrindən götürülmüşdür:

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

Adminer , PHP-də yazılmış bir verilənlər bazası idarə vasitədir.

7
02 авг. istifadəçi tərəfindən verilmiş cavab 02 avqu . 2016-08-02 06:15 '16 saat 06:15 'da 2016-08-02 06:15

Bir çox sürətli yolu bir şey etməkdir:

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

Bu, 10 simvol uzunluğuna malik bir təsadüfi simli yaradır. Əlbəttə ki, bəzilər hesablama tərəfində bir az daha çətin olduğunu söyləyə bilərlər, lakin hazırda prosessorlar md5 və ya sha256 alqoritmini tez buraxmaq üçün optimallaşdırılır. Və, əlbəttə, rand() funksiyası eyni dəyəri qaytarır, nəticə eyni olacaq, eyni olmaq 1/32767 şansına malikdir. Bir təhlükəsizlik problemi varsa, yalnız rand() ı mt_rand()

6
24 окт. cavab oktyabrın 24-də Akatosh tərəfindən verilir 2013-10-24 19:04 '13 at 19:04 2013-10-24 19:04

Laravel 5 strukturundan köməkçi funksiya

  function str_random($length = 16) { $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; return substr(str_shuffle(str_repeat($pool, $length)), 0, $length); } 
5
17 февр. Cavab 17 fevralda artnikpro tərəfindən verilmişdir. 2015-02-17 22:03 '15 at 10:03 pm 2015-02-17 22:03

bir xətt.
bəzi nadir hallarda böyük xətlər üçün sürətli.

 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 Cavab Jacob Smith tərəfindən 19 May 'da 23:47' də verilir 2015-05-19 23:47

Funksiyanın redaktə edilmiş versiyası yaxşı işlədib, yalnız bir problem tapdum: $ simvol əlavə etmək üçün yanlış xarakterdən istifadə etdiniz, buna görə də xarakter bəzən yaranan təsadüfi simvolun bir hissəsidir.

Bunu düzəltmək üçün dəyişin:

 $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 

in

 $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; 

Beləliklə, yalnız qapalı simvollar istifadə olunur və xarakter heç vaxt təsadüfi bir simvolun tərkib hissəsi olmayacaqdır.

4
08 авг. cavab bmcswee 08 aug verilir . 2012-08-08 19:18 '12 at 7:18 pm 2012-08-08 19:18

Məktub və nömrələri olan 10 simvoldan ibarət təsadüfi bir simli yaradan başqa bir-line. Bu sıra ilə bir array yaradır (ölçüsü təyin etmək üçün ikinci parametrləri tənzimləyin), bu array üzərində loop və təsadüfi ascii-char (aralığı 0-9 və ya az) atayın, sonra bir string almaq üçün array blur edəcək.

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

Qeyd: PHP 5.3 + yalnız işləyir

4
01 авг. Cavab kasimir 01 aug tərəfindən verilir . 2014-08-01 17:20 '14 da 17:20 2014-08-01 17:20
  function generateRandomString($length = 10, $abc = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") { return substr(str_shuffle($abc), 0, $length); } 

Http://www.xeweb.net/2011/02/11/generate-a-random-string-az-0-9-in-php/ mənbəyi

4
23 дек. cavab sxn 23 dekabr verilir . 2017-12-23 13:57 '17 da 13:57 2017-12-23 13:57

Openssl_random_pseudo_bytes istifadə etdiyin sonuncu şərhi sevdim, amma mənim üçün bir həll olmadı, çünki mən hələ də ehtiyac duymayan simvolları silmək məcburiyyətində oldum və müəyyən uzunluqda bir simli ala bilmədim. İşdə qərarım ...

 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 февр. Cavab 11 fevralda RKaneKnight tərəfindən verilir. 2013-02-11 00:02 '13 'da 0:02 2013-02-11 00:02
 function randomString($length = 5) { return substr(str_shuffle(implode(array_merge(range('A','Z'), range('a','z'), range(0,9)))), 0, $length); } 
3
20 янв. Cavab Anjith KP tərəfindən verilir 20 Yanvar 2017-01-20 19:35 '17 saat 19:35 'da 2017-01-20 19:35

Nəhayət, mənim həllimin təsadüfi və unikal dəyərini almaq üçün bir həll tapdım.

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

vaxt həmişə bir timstampa qaytarılır və həmişə unikaldır. Daha yaxşı etmək üçün onu md5 ilə istifadə edə bilərsiniz.

2
22 мая '17 в 12:21 2017-05-22 12:21 Cavab 22 may tarixində saat 12.21- də 2017-05-22 12:21 Məhəmməd Cüneyt Aslam tərəfindən verilmişdir

PHP-də təsadüfi strings yaratmaq üçün başqa bir üsul:

 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 окт. Cavab Akhilraj NS 19 oct verilir . 2012-10-19 09:01 '12 saat 09:01 'da 2012-10-19 09:01

Sadə bir kod var:

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

Sadə bir bələdçi var:

  • Dize uzunluğunu dəyişdirmək üçün 16 dəyərini başqa bir dəyərə dəyişdirin.
  • Fərqli simvollardan seçmək üçün, simvolu simli dəyişdirin.
2
02 авг. cavab 16ctt1x 02 aug verilir . 2016-08-02 18:21 '16 saat 06:21 'da 2016-08-02 18:21

Aşağıdakı funksiya hər hansı bir uzunluqdakı bir sözdəki simli yaradır.

  function get_random_string($length) { $pull = []; while (count($pull) < $length) { $pull = array_merge($pull, range(0, 9), range('a', 'z'), range('A', 'Z')); } shuffle($pull); return substr(implode($pull), 0, $length); } 
1
02 июня '16 в 14:24 2016-06-02 14:24 Cavab ya.teck 02 iyun '14 saat 14:24 2016-06-02 14:24 verilir

Yuxarıda göstərilən müzakirələrdən bəzi xüsusiyyətləri olan bir sinif.

 $options['numeric'] = true; $options['uppercase'] = true; $options['lowercase'] = true; $new = new RandomString($options); class RandomString {  private $default = ['numeric' => true, 'uppercase' => true, 'lowercase' => true];  private $options;  private $whitelist = ['numeric', 'uppercase', 'lowercase'];  public function __construct(array $options = []) { $this->options = $this->default; if(!empty($options)) { $options = array_intersect_key($options, array_flip($this->whitelist)); if(empty($options)) { $this->options = $this->default; }else { $this->options = $options; } } }  private function returnCharacters(){ $options = $this->options; $numbers = '0123456789'; $uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $lowercase = "abcdefghijklmnopqrstuvwxyz"; $characters = ''; if(isset($options['numeric'])  $options['numeric'] === true){ $characters .= $numbers; } if(isset($options['uppercase'])  $options['uppercase'] === true){ $characters .= $uppercase; } if(isset($options['lowercase'])  $options['lowercase'] === true){ $characters .= $lowercase; } return $characters; }  public function randomString($length, $quantity) { $string = ''; $characters = $this->returnCharacters(); for ($j = 0; $j < $quantity; $j++) { for($i = 0; $i < $length; $i++){ $string .= $characters[mt_rand(0, strlen($characters) - 1)]; } $string .= "\n"; } return $string; }  public function getOptions() { return $this->options; }  public function getWhitelist() { return $this->whitelist; } 
1
21 июля '17 в 9:55 2017-07-21 09:55 Cavab verilir dixromos98 21 İyul 21 'da 9:55 2017-07-21 09:55

bunun üçün daha yaxşı alternativlər var, bir çoxu artıq göndərilmişdir, buna görə də sizə maddənin düzəldilməsini verirəm

 <?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; ?> 
1
02 янв. Cavab Constantin tərəfindən verilir 02 yanvar. 2018-01-02 19:13 '18 at 19:13 2018-01-02 19:13

Mənbə: təsadüfi simvol yaradan PHP funksiyası.

Bu PHP funksiyası mənim üçün işləyirdi:

 function cvf_ps_generate_random_code($length=10) { $string = ''; // You can define your own characters here. $characters = "23456789ABCDEFHJKLMNPRTVWXYZabcdefghijklmnopqrstuvwxyz"; for ($p = 0; $p < $length; $p++) { $string .= $characters[mt_rand(0, strlen($characters)-1)]; } return $string; } 

İstifadə edin:

 echo cvf_ps_generate_random_code(5); 
1
09 янв. Cavab Carl Jan 09 tərəfindən verilir 2015-01-09 10:46 '15 at 10:46 2015-01-09 10:46
  • 1
  • 2

Tags sualları ilə bağlı digər suallar və ya bir sual