Подтвердить что ты не робот

Создать случайную строку из 5 символов

Я хочу создать точную строку из 5 случайных символов с минимальной возможностью дублирования. Какой был бы лучший способ сделать это? Спасибо.

4b9b3361

Ответ 1

$rand = substr(md5(microtime()),rand(0,26),5);

Было бы моим лучшим предположением - если вы ищите специальные символы:

$seed = str_split('abcdefghijklmnopqrstuvwxyz'
                 .'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                 .'[email protected]#$%^&*()'); // and any other characters
shuffle($seed); // probably optional since array_is randomized; this may be redundant
$rand = '';
foreach (array_rand($seed, 5) as $k) $rand .= $seed[$k];

Пример

И для одного, основанного на часах (меньше конфликтов с его инкрементального значения):

function incrementalHash($len = 5){
  $charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  $base = strlen($charset);
  $result = '';

  $now = explode(' ', microtime())[1];
  while ($now >= $base){
    $i = $now % $base;
    $result = $charset[$i] . $result;
    $now /= $base;
  }
  return substr($result, -5);
}

Примечание: инкрементные средства легче угадать; Если вы используете это как соль или токен проверки, не делайте этого. Соль (сейчас) "WCWyb" означает 5 секунд с ее "WCWyg" )

Ответ 2

Если петли for не работают, вот что мне нравится:

$s = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0, 5);

Ответ 3

Быстрый способ - использовать самые изменчивые символы функции uniqid.

Например:

$rand = substr(uniqid('', true), -5);

Ответ 4

Следующее должно обеспечить наименьшую вероятность дублирования (вы можете заменить mt_rand() лучшим источником случайных чисел, например, из /dev/*random или из GUID):

<?php
    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $result = '';
    for ($i = 0; $i < 5; $i++)
        $result .= $characters[mt_rand(0, 61)];
?>

EDIT:
Если вы обеспокоены безопасностью, действительно, не используйте rand() или mt_rand() и убедитесь, что ваше устройство случайных данных на самом деле является устройством, генерирующим случайные данные, а не обычный файл или что-то предсказуемое, например /dev/zero. mt_rand() считается вредным:
https://spideroak.com/blog/20121205114003-exploit-information-leaks-in-random-numbers-from-python-ruby-and-php

EDIT: Если у вас есть поддержка OpenSSL в PHP, вы можете использовать openssl_random_pseudo_bytes():

<?php
    $length = 5;
    $randomBytes = openssl_random_pseudo_bytes($length);
    $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
    $charactersLength = strlen($characters);
    $result = '';
    for ($i = 0; $i < $length; $i++)
        $result .= $characters[ord($randomBytes[$i]) % $charactersLength];
?>

Ответ 5

Вы можете попробовать это просто так:

$length = 5;

$randomletter = substr(str_shuffle("abcdefghijklmnopqrstuvwxyz"), 0, $length);

подробнее: http://forum.arnlweb.com/viewtopic.php?f=7&t=25

Ответ 6

Я всегда использую для этого одну и ту же функцию, обычно для генерации паролей. Он прост в использовании и полезен.

function randPass($length, $strength=8) {
    $vowels = 'aeuy';
    $consonants = 'bdghjmnpqrstvz';
    if ($strength >= 1) {
        $consonants .= 'BDGHJLMNPQRSTVWXZ';
    }
    if ($strength >= 2) {
        $vowels .= "AEUY";
    }
    if ($strength >= 4) {
        $consonants .= '23456789';
    }
    if ($strength >= 8) {
        $consonants .= '@#$%';
    }

    $password = '';
    $alt = time() % 2;
    for ($i = 0; $i < $length; $i++) {
        if ($alt == 1) {
            $password .= $consonants[(rand() % strlen($consonants))];
            $alt = 0;
        } else {
            $password .= $vowels[(rand() % strlen($vowels))];
            $alt = 1;
        }
    }
    return $password;
}

Ответ 7

Кажется, что str_shuffle было бы полезно для этого. Перемешайте тасование с любыми символами, которые вы хотите.

$my_rand_strng = substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), -5);

Ответ 8

Если будет хорошо, что вы получите только буквы A-F, то здесь мое решение:

str_pad(dechex(mt_rand(0, 0xFFFFF)), 5, '0', STR_PAD_LEFT);

Я считаю, что использование хеш-функций является излишним для такой простой задачи, как генерация последовательности случайных шестнадцатеричных цифр. dechex + mt_rand будет выполнять ту же работу, но без ненужной криптографической работы. str_pad гарантирует 5-символьную длину выходной строки (если случайное число меньше 0x10000).

Повторяющаяся вероятность зависит от надежности mt_rand. Mersenne Twister известен высококачественной случайностью, поэтому он должен хорошо соответствовать задаче.

Ответ 9

$str = '';
$str_len = 8;
for($i = 0, $i < $str_len; $i++){
    //97 is ascii code for 'a' and 122 is ascii code for z
    $str .= chr(rand(97, 122));
}
return $str

Ответ 10

Как и Brad Christie, но используя sha1 alrorithm для символов 0-9a-zA-Z и префикс со случайным значением:

$str = substr(sha1(mt_rand() . microtime()), mt_rand(0,35), 5);

Но если вы задали определенные (допустимые) символы:

$validChars = array('0','1','2' /*...*/,'?','-','_','a','b','c' /*...*/);
$validCharsCount = count($validChars);

$str = '';
for ($i=0; $i<5; $i++) {
    $str .= $validChars[rand(0,$validCharsCount - 1)];
}

** ОБНОВЛЕНИЕ **

Как отмечалось в Archimedix, это не гарантирует возврата "наименьшей возможности дублирования", поскольку количество комбинаций является низким для данного диапазона символов, Вам нужно либо увеличить количество символов, либо разрешить дополнительные (специальные) символы в строке. Я думаю, первое решение было бы предпочтительным в вашем случае.

Ответ 11

отлично работает в PHP (php 5.4.4)

$seed = str_split('abcdefghijklmnopqrstuvwxyz');
$rand = array_rand($seed, 5);
$convert = array_map(function($n){
    global $seed;
    return $seed[$n];
},$rand);

$var = implode('',$convert);
echo $var;

Live Demo

Ответ 12

Я также не знал, как это сделать, пока я не подумал об использовании PHP array. И я уверен, что это самый простой способ генерации случайной строки или числа с массивом. Код:

function randstr ($len=10, $abc="aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789") {
    $letters = str_split($abc);
    $str = "";
    for ($i=0; $i<=$len; $i++) {
        $str .= $letters[rand(0, count($letters)-1)];
    };
    return $str;
};

Вы можете использовать эту функцию следующим образом

randstr(20)     // returns a random 20 letter string
                // Or like this
randstr(5, abc) // returns a random 5 letter string using the letters "abc"

Ответ 13

Источник: Функция PHP, которая генерирует случайные символы

Эта простая функция PHP работала для меня:

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;

}

Использование:

echo cvf_ps_generate_random_code(5);

Ответ 14

Вот мой random 5 cents...

$random=function($a, $b) {
    return(
        substr(str_shuffle(('\\`)/|@'.
        password_hash(mt_rand(0,999999),
        PASSWORD_DEFAULT).'!*^&~(')),
        $a, $b)
    );
};

echo($random(0,5));

PHP new password_hash() (* >= PHP 5.5) функция выполняет задание для генерации прилично длинного набора прописных и строчных символов и цифр.

Два concat. строки до и после password_hash в пределах $random function подходят для изменения.

Параметры для $random() * ($ a, $b) на самом деле являются параметрами substr().:)

ПРИМЕЧАНИЕ: это не должно быть функцией, это может быть и нормальная переменная.. как один неприятный сингллайнер, например:

$random=(substr(str_shuffle(('\\`)/|@'.password_hash(mt_rand(0,999999), PASSWORD_DEFAULT).'!*^&~(')), 0, 5));

echo($random);

Ответ 15

Я использую это:

<?php function fRand($len) {
    $str = '';
    $a = "abcdefghijklmnopqrstuvwxyz0123456789";
    $b = str_split($a);
    for ($i=1; $i <= $len ; $i++) { 
        $str .= $b[rand(0,strlen($a)-1)];
    }
    return $str;
} ?>

Когда вы вызываете его, задается длина строки.

<?php echo fRand([LENGHT]); ?>

Вы также можете изменить возможные символы в строке $a.

Ответ 16

function CaracteresAleatorios( $Tamanno, $Opciones) {
    $Opciones = empty($Opciones) ? array(0, 1, 2) : $Opciones;
    $Tamanno = empty($Tamanno) ? 16 : $Tamanno;
    $Caracteres=array("0123456789","abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ");
    $Caracteres= implode("",array_intersect_key($Caracteres, array_flip($Opciones)));
    $CantidadCaracteres=strlen($Caracteres)-1;
    $CaracteresAleatorios='';
    for ($k = 0; $k < $Tamanno; $k++) {
        $CaracteresAleatorios.=$Caracteres[rand(0, $CantidadCaracteres)];
    }
    return $CaracteresAleatorios;
}