Rastgele alfa sayısal dizeler oluşturma (sözde)


Yanıtlar:


164

Önce tüm olası karakterlerinizi içeren bir dizge oluşturun:

 $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';

Bunu daha hızlı yapmak için range () de kullanabilirsiniz .

Ardından, bir döngüde rastgele bir sayı seçin ve $charactersrastgele bir karakter elde etmek için dizenin dizini olarak kullanın ve onu dizenize ekleyin:

 $string = '';
 $max = strlen($characters) - 1;
 for ($i = 0; $i < $random_string_length; $i++) {
      $string .= $characters[mt_rand(0, $max)];
 }

$random_string_length rastgele dizenin uzunluğudur.


9
Bu uygulama, "l" ve "1", "O" ve "0" gibi aynı görünen karakterleri kaldırmak isterseniz de güzel. Kullanıcılar için yeni şifreler oluştururken bu faydalıdır.
Mark Nold

10
Ayrıca bu tekniği kullanıyorum ve tüm ünlüleri kaldırıyorum, böylece yanlışlıkla birine parola için kaba bir şey vermem.
nickf

10
Küçük iyileştirme: mt_rand()yerine geçmesidir rand()ve daha iyidir.
Grilse

11
strlen()Her yinelemeyi yürütmek iyi değildir. strlen($characters) - 1Bir değişkene atayın ve döngüden çıkın. Bu durumda kritik değil, ama sadece Mauvais ton .
mintobit

6
Kriptografik olarak güvenli bir rasgele ihtiyacınız varsa random_int kullanmayı düşünün .
reallynice

18

Bu işlevi iş için seviyorum

function randomKey($length) {
    $pool = array_merge(range(0,9), range('a', 'z'),range('A', 'Z'));

    for($i=0; $i < $length; $i++) {
        $key .= $pool[mt_rand(0, count($pool) - 1)];
    }
    return $key;
}

echo randomKey(20);

14

Openssl_random_pseudo_bytes işlevini kullanarak kriptografik açıdan güçlü, rastgele (potansiyel olarak) 8 karakterli bir dize oluşturun :

echo bin2hex(openssl_random_pseudo_bytes(4));

Prosedür yolu:

function randomString(int $length): string
{
    return bin2hex(openssl_random_pseudo_bytes($length));
}

Güncelleme:

PHP7 random_x()daha da iyi olması gereken işlevleri tanıttı . PHP 5.X'ten geliyorsanız, PHP 7'den random_bytes () ve random_int () için bir polyfill olan mükemmel paragonie / random_compat kitaplığını kullanın .

function randomString($length)
{
    return bin2hex(random_bytes($length));
}

7

Tek satırlık çözüm:

echo substr( str_shuffle( str_repeat( 'abcdefghijklmnopqrstuvwxyz0123456789', 10 ) ), 0, 7 );

Dizeniz için farklı bir uzunluk ayarlamak için substr parametresini değiştirebilirsiniz.


4

Bir harf aralığı seçmek için ASCII tablosunu kullanın; burada: $ aralık_başlangıç, $ aralık_son, ASCII tablosundaki ondalık sütundan bir değerdir.

Bu yöntemin, karakter aralığının başka bir dizede özel olarak tanımlandığı açıklanan yöntemle karşılaştırıldığında daha güzel olduğunu buldum .

// range is numbers (48) through capital and lower case letters (122)
$range_start = 48;
$range_end   = 122;
$random_string = "";
$random_string_length = 10;

for ($i = 0; $i < $random_string_length; $i++) {
  $ascii_no = round( mt_rand( $range_start , $range_end ) ); // generates a number within the range
  // finds the character represented by $ascii_no and adds it to the random string
  // study **chr** function for a better understanding
  $random_string .= chr( $ascii_no );
}

echo $random_string;

Daha fazla gör:


1
Alfasayısal olmayan karakterler bu ACSII aralığına girse de bu güzeldir.
Bower

4

Eski bir gönderi olduğunu biliyorum ama Jeremy Ruten'in cevabına dayanarak oluşturduğum ve yorumlarda önerilerle geliştirdiğim bir sınıfa katkıda bulunmak istiyorum:

    class RandomString
    {
      private static $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
      private static $string;
      private static $length = 8; //default random string length

      public static function generate($length = null)
      {

        if($length){
          self::$length = $length;
        }

        $characters_length = strlen(self::$characters) - 1;

        for ($i = 0; $i < self::$length; $i++) {
          self::$string .= self::$characters[mt_rand(0, $characters_length)];
        }

        return self::$string;

      }

    }

3

Basit adamlar .... ama her baytın 0 ile 255 arasında rastgele olduğunu unutmayın ki bu rastgele bir dizge için iyi olacaktır. Ayrıca, her baytı temsil edecek iki karakteriniz olacağını unutmayın.

$str = bin2hex(random_bytes(32));  // 64 character string returned

Şimdiye kadar en iyi cevap ve en kısa kod! Bu daha fazla olumlu oy almalı
Sliq


2

Aşağıdaki hızlı işlevi sadece işlevle oynamak için yaptım range(). Bazen birine yardımcı olabilir.

Function pseudostring($length = 50) {

    // Generate arrays with characters and numbers
    $lowerAlpha = range('a', 'z');
    $upperAlpha = range('A', 'Z');
    $numeric = range('0', '9');

    // Merge the arrays
    $workArray = array_merge($numeric, array_merge($lowerAlpha, $upperAlpha));
    $returnString = "";

    // Add random characters from the created array to a string
    for ($i = 0; $i < $length; $i++) {
        $character = $workArray[rand(0, 61)];
        $returnString .= $character;
    }

    return $returnString;
}

2

Aşağıdaki kodu kullanabilirsiniz. Özel karakter sayısını zorlayabilmeniz dışında mevcut işlevlere benzer:

function random_string() {
    // 8 characters: 7 lower-case alphabets and 1 digit
    $character_sets = [
        ["count" => 7, "characters" => "abcdefghijklmnopqrstuvwxyz"],
        ["count" => 1, "characters" => "0123456789"]
    ];
    $temp_array = array();
    foreach ($character_sets as $character_set) {
        for ($i = 0; $i < $character_set["count"]; $i++) {
            $random = random_int(0, strlen($character_set["characters"]) - 1);
            $temp_array[] = $character_set["characters"][$random];
        }
    }
    shuffle($temp_array);
    return implode("", $temp_array);
}

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

1

Bunu yapmanın çok kolay bir yolunu istiyorsanız, mevcut PHP işlevlerine güvenebilirsiniz. Kullandığım kod bu:

substr( sha1( time() ), 0, 15 )

time()size epoch'tan beri geçerli zamanı saniye cinsinden verir sha1(), 0-9a-f dizesine şifreler ve substr()bir uzunluk seçmenize izin verir. 0 karakterinden başlamak zorunda değilsiniz ve iki sayı arasındaki fark ne olursa olsun dizenin uzunluğu olacaktır.



0

Jeremy'nin cevabı harika. Benim gibi, range () 'yi nasıl uygulayacağınızdan emin değilseniz, benim sürümümü range () kullanarak görebilirsiniz.

<?php
$character_array = array_merge(range('a', 'z'), range(0, 9));
$string = "";
    for($i = 0; $i < 6; $i++) {
        $string .= $character_array[rand(0, (count($character_array) - 1))];
    }
echo $string;
?>

Bu, Jeremy'ninki ile tam olarak aynı şeyi yapar, ancak bir dizge kullandığı yerde birleştirilmiş diziler kullanır ve strlen () kullandığı yerde count () kullanır.


2
olması gerekiyorrange('a','z');
Mehdi Karamosly

0

1 satır:

$FROM = 0; $TO = 'zzzz';
$code = base_convert(rand( $FROM ,base_convert( $TO , 36,10)),10,36);
echo $code;

0

Bunu gerçek randevu için tip ipucu / rand_int ile yapmanın modern yolu

function random_string(int $size): string
{
    $characters = array_merge(
        range(0, 9),
        range('A', 'Z')
    );

    $string = '';
    $max = count($characters) - 1;
    for ($i = 0; $i < $size; $i++) {
        $string .= $characters[random_int(0, $max)];
    }

    return $string;
}

0

Önce istenen karakterleri listeleyin

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

Str_shuffle ($ dizge) işlevini kullanın. Bu işlev size rastgele karıştırılmış bir dize sağlayacaktır.

$alpha=substr(str_shuffle($chars), 0, 50);

50, dizenin uzunluğudur.


0
public function randomString($length = 8)
{
    $characters = implode([
        'ABCDEFGHIJKLMNOPORRQSTUWVXYZ',
        'abcdefghijklmnoprqstuwvxyz',
        '0123456789',
        //'!@#$%^&*?'
    ]);

    $charactersLength = strlen($characters) - 1;
    $string           = '';

    while ($length) {
        $string .= $characters[mt_rand(0, $charactersLength)];
        --$length;
    }

    return $string;
}

Küçük ve büyük harf dizilerinde farklı sayıda karakteriniz var. Ve bu kodun daha önce burada yayınlanan diğer tüm varyantlara göre herhangi bir avantajı var mı?
magras
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.