Генерация случайной строки из 5 символов



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

593   16  

16 ответов:

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

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

$seed = str_split('abcdefghijklmnopqrstuvwxyz'
                 .'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
                 .'0123456789!@#$%^&*()'); // 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")

Если for петли находятся на дефиците, вот что мне нравится использовать:

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

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

например:

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

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

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

EDIT:
Если вы беспокоитесь о безопасности, действительно, делать не использовать rand() или mt_rand(), и убедитесь, что ваше случайное устройство данных на самом деле является устройством, генерирующим случайные данных, а не обычный файл или что-то предсказуемое, как /dev/zero. mt_rand() считается harmful:
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];
?>

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

$length = 5;

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

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

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

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

Кажется str_shuffle было бы хорошим использованием для этого. Семена перемешать с какими символами вы хотите.

$my_rand_strng = substr(str_shuffle("ABCDEFGHIJKLMNOPQRSTUVWXYZ"), -5);
$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

Я также не знал, как это сделать, пока я не подумал об использовании 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"

если это нормально, что вы получите только буквы A-F, то вот мое решение:

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

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

вероятность дублирования зависит от mt_rand ' s надежность. Вихрь Мерсена известен высококачественной случайностью, поэтому он должен хорошо соответствовать задаче.

аналогично Брэд Кристи'ы ответ, но с помощью 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 указано, что это не гарантирует возврата "наименьшей возможности дублирования", поскольку количество комбинаций является низким для данного диапазона символов. Вы нужно будет либо увеличить количество символов, либо разрешить дополнительные (специальные) символы в строке. Первое решение было бы предпочтительнее, я думаю, в вашем случае.

работает в 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;

Демо

источник: 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);

вот мои 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 password_hash() (* >= PHP 5.5) функция делает работу для генерации прилично длинного набора прописных и строчных символов и чисел.

два concat. строки до и после password_hash в пределах $ случайная функция подходит для изменения.

Paramteres для $random() *($a,$b) На самом деле substr() параметры. :)

Примечание: это не должно быть функцией, это может быть нормальная переменная также .. как один противный сингллайнер, вот так:

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

echo($random);

Я всегда использую это:

<?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.

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

Comments

    Ничего не найдено.