PHP kullanarak rasgele bir dize oluşturmak nasıl?

16 Cevap php

Ben PHP rand fonksiyonu rasgele tamsayılar oluşturur biliyorum, ama ne gibi rastgele bir dize oluşturmak için en iyi yoldur:

Original string, 9 chars

$string = 'abcdefghi';

Example random string limiting to 6 chars

$string = 'ibfeca';

GÜNCELLEME: Ben temelde her adımın arkasında mantığını anlamaya çalışıyorum, bu tür işlevler ton bulduk.

GÜNCELLEME: gerektiği gibi işlev karakter herhangi bir miktarda üretmek gerekir.

Eğer cevap eğer parçaları yorum yapın.

16 Cevap

Peki, ben benim yorumum sorulan tüm sorulara açıklık yoktu, ama "olası" bir karakter dizisini ve geri dönmek için dize uzunluğunu alabilir bir işlev istediğinizi varsayalım edeceğiz. Iyice gibi netlik için, daha değişken ben normalde daha kullanarak, istenen yorumladı:

function get_random_string($valid_chars, $length)
{
    // start with an empty random string
    $random_string = "";

    // count the number of chars in the valid chars string so we know how many choices we have
    $num_valid_chars = strlen($valid_chars);

    // repeat the steps until we've created a string of the right length
    for ($i = 0; $i < $length; $i++)
    {
        // pick a random number from 1 up to the number of valid chars
        $random_pick = mt_rand(1, $num_valid_chars);

        // take the random character out of the string of valid chars
        // subtract 1 from $random_pick because strings are indexed starting at 0, and we started picking at 1
        $random_char = $valid_chars[$random_pick-1];

        // add the randomly-chosen char onto the end of our string so far
        $random_string .= $random_char;
    }

    // return our finished random string
    return $random_string;
}

Sizin örnek verilerle bu işlevini çağırmak için, gibi bir şey derim:

$original_string = 'abcdefghi';
$random_string = get_random_string($original_string, 6);

Bu işlevi, kendisine iletilen geçerli karekter teklik kontrol unutmayın. Eğer geçerli bir karakter dize ile denir Örneğin, 'AAAB', bu bağlı olarak, bir hata ya da bir özelliği olarak kabul edilebilir bir B olarak her harf için bir A seçmek için üç kat daha fazla olurdu sizin ihtiyaçlarınıza.

Eğer karakter tekrarlayan tekrarlarını izin vermek istiyorsanız, bu fonksiyonu kullanabilirsiniz:

function randString($length, $charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
{
    $str = '';
    $count = strlen($charset);
    while ($length--) {
        $str .= $charset[mt_rand(0, $count-1)];
    }
    return $str;
}

Temel algoritma oluşturmak için <length> kez 0 ve <number of characters> arasında rastgele bir sayı 1 - Bizim kümesinden bir karakter seçin ve bu karakterleri birleştirmek için endeks olarak kullanın. Ve 0 <number of characters> - İlk karakter $charset[0] ve $charset[count($charset) - 1] ile son ile ele olarak 1 sınırları $charset dize sınırlarını temsil eder.

Benim en sevdiğim:

 echo substr(md5(rand()), 0, 7);
function generate_random_string($name_length = 8) {
	$alpha_numeric = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
	return substr(str_shuffle($alpha_numeric), 0, $name_length);
}

tartışmak

Sonundaki karakterleri katılmadan dize birleştirme tekrarladı daha verimli olmalıdır.

Düzenleme # 1: karakter tekrarını önlemek için seçenek eklendi.

Düzenleme # 2: $ noRepeat seçilirse sonsuz döngüye girmesini önlemek istisna atar ve $ len seçim için charset daha büyüktür.

Düzenleme # 3: ilişkisel dizi anahtar arama doğrusal dizi arıyor daha hızlıdır $ noRepeat, seçildiğinde aldı rasgele karakterleri depolamak için dizi anahtarlarını kullanır.

function rand_str($len, $norepeat = true)
{
    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    $max = strlen($chars) - 1;

    if ($norepeat && len > $max + 1) {
        throw new Exception("Non repetitive random string can't be longer than charset");
    }

    $rand_chars = array();

    while ($len) {
        $picked = $chars[mt_rand(0, $max)];

        if ($norepeat) {
            if (!array_key_exists($picked, $rand_chars)) {
                $rand_chars[$picked] = true;
                $len--;
            }
        }
        else {
            $rand_chars[] = $picked;
            $len--;
        }
    }

    return implode('', $norepeat ? array_keys($rand_chars) : $rand_chars);   
}

Bu rastgele bir dize üretecek

function generateRandomString($length=10) {
    $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 generateRandomString(6);

Eğer orijinal harflerin rastgele permütasyonundan tarafından şifrenizi oluşturmak istiyor musunuz? Sadece benzersiz karakter içermelidir?

rand endeksine göre rastgele harf seçmek için kullanın.

Most aspects of this have already been discussed, but i'd recommend a slight update: If you are using this for retail usage, I would avoid the domain ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 and instead use: ABCDEFGHJKMNPQRSTUVWXY3456789

Verilen, çok daha az karakter ile sonuna kadar, ancak müşterilerin Ayrıca Z. için l ya da 2 için O, veya 1 için 0 hata değil gibi, güçlük büyük bir tasarruf, sen girişindeki bir üst yapabilir ve müşterilere daha sonra olabilir Üst veya alt harf girmek - onlar benzer beri de bazen kafa karıştırıcı olduğunu.

A better and updated version of @taskamiski's excellent answer:

Better sürümü, mt_rand() yerine kullanılarak rand():

echo md5(mt_rand()); // 32 char string = 128bit

Daha da iyisi, uzun dizeleri için, karma algorithmns seçmenizi sağlar hash() fonksiyonunu kullanarak:

echo hash('sha256', mt_rand()); // 64 char string
echo hash('sha512', mt_rand()); // 128 char string

Eğer en fazla 50 karakterden diyelim aşağı sonucu kesmek istiyorsanız, bunu şöyle yapın:

echo substr(hash('sha256', mt_rand()), 0, 50); // 50 char string

Eğer bir karakter dizisi o diziden bir mektup almak için () rand kullanmak ve bunu bir dizeye ilave yapabiliriz.

$letters = array( [0] => 'a' [1] => 'b' [2] => 'c' [3] => 'd' ... [25] = 'z');

$lengthOfString = 10;
$str = '';

while( $lengthOfString-- )
{
   $str .= $letters[rand(0,25)];
}
echo $str;

* Bu izin vermez unutmayın tekrar karakterler

Her zaman kullanılır, bu geçmişte: bin2hex(microtime(true))

Benim projelerde çok yararlı olduğu http://www.sensiblephp.com/create-a-random-string-in-php.html bu kod parçacığını bulundu.

Bu ana karakter kümesinin atlanır karakter kümesi listelemek için işlevler ekleyerek Gumbo's solution üzerine inşa. Rasgele dize de $skip_charset görünmüyor $base_charset karakterleri seçer.

/* Make a random string of length using characters from $charset, excluding $skip_chars.
 * @param length (integer) length of return value
 * @param skip_chars (string) characters to be excluded from $charset
 * @param charset (string) characters of posibilities for characters in return val
 * @return (string) random string of length $length    */
function rand_string(
        $length, 
        $skip_charset = '', 
        $base_charset='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'){
  $skip_len = strlen($skip_charset);
  for ($i = 0; $i<$skip_len; $i++){
    $base_charset = str_replace($skip_charset[$i], '', $base_charset);
  }
  cvar_dump($base_charset, '$base_charset after replace');
  $str = '';
  $count = strlen($base_charset);
  while ($length--) {
    $str .= $base_charset[mt_rand(0, $count - 1)];
  }
  return $str;
}

İşte bazı kullanım örnekleri vardır. İlk iki örnek $base_charset için varsayılan değeri kullanın. Son örnek açıkça tanımlayan $base_charset.

echo rand_string(15, 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
//  470620078953298
echo rand_string(8, 'abcdefghijklmnopqrstuvwxyz0123456789');
//  UKLIHOTFSUZMFPU
echo rand_string(15, 'def', 'abcdef');
//  cbcbbccbabccaba
// @author http://codeascraft.etsy.com/2012/07/19/better-random-numbers-in-php-using-devurandom/                                                
function devurandom_rand($min = 0, $max = 0x7FFFFFFF)
{
    $diff = $max - $min;
    if ($diff < 0 || $diff > 0x7FFFFFFF) {
        throw new RuntimeException('Bad range');
    }
    $bytes = mcrypt_create_iv(4, MCRYPT_DEV_URANDOM);
    if ($bytes === false || strlen($bytes) != 4) {
        throw new RuntimeException('Unable to get 4 bytes');
    }
    $ary = unpack('Nint', $bytes);
    $val = $ary['int'] & 0x7FFFFFFF; // 32-bit safe                           
    $fp = (float) $val / 2147483647.0; // convert to [0,1]                          
    return round($fp * $diff) + $min;
}

function build_token($length = 60, $characters_map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789') {
    $map_length = mb_strlen($characters_map)-1;
    $token = '';
    while ($length--) {
        $token .= mb_substr($characters_map, devurandom_rand(0,$map_length),1);
    }
    return $token;
}

Bu sadece PHP mcrypt ile derlenmiş UNIX ortamında çalışır.

iyi, ben bir çözüm arıyordum, ve Chad Birch çözümü @ Gumbo adlı biri ile birleştirilerek @ Ben kullanılan kindda. Bu ben ile geldi budur:

function get_random_string($length, $valid_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz123456790!·$%&/()=?¿¡',.-;:+*`+´ç")
{
    $random_string = "";
    $num_valid_chars = strlen($valid_chars);
    for ($i = 0; $i < $length; $i++, $random_string .= $valid_chars[mt_rand(1, $num_valid_chars)-1]);
    return $random_string;
}

Ben comments hemen hemen unnecesary Ben bunu oluşturmak için kullanılan cevapları beri zaten iyice yorumladı düşünüyorum. Şerefe!

$amount_of_chars = "6";//Amount of chars wanted for the new string.
$string = substr(str_shuffle("abcdefghi"), 0, $amount_of_chars);
echo $string;

Bu dize shuffle ve rasgele 6 karakter birini oluşturacaktır.