(의사) 임의의 영숫자 문자열 생성


답변:


164

먼저 가능한 모든 문자로 문자열을 만드십시오.

 $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';

range () 를 사용 하여 더 빨리 할 수도 있습니다 .

그런 다음 루프에서 임의의 숫자를 선택하고 $characters문자열에 대한 인덱스로 사용 하여 임의의 문자를 가져 와서 문자열에 추가합니다.

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

$random_string_length 무작위 문자열의 길이입니다.


9
이 구현은 "l"및 "1", "O"및 "0"과 같이 똑같이 보이는 문자를 제거하려는 경우에도 좋습니다. 이것은 사용자를위한 새 암호를 생성 할 때 유용합니다.
Mark Nold

10
또한이 기술을 사용하고 모든 모음을 제거하여 실수로 누군가에게 암호에 대해 무례한 것을주지 않도록합니다.
nickf

10
사소한 개선 :을 (를 mt_rand()) 대체하는 드롭 인 rand()이며 더 좋습니다.
연어 새끼

11
strlen()각 반복을 실행 하는 것은 좋지 않습니다. strlen($characters) - 1변수에 할당 하고주기에서 strlen을 수행합니다. 이 경우 중요하지는 않지만 Mauvais ton 입니다.
mintobit

6
암호화 보안 무작위가 필요한 경우 random_int 사용을 고려하십시오 .
reallynice

18

나는이 일을 위해이 기능을 좋아한다

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 함수를 사용하여 암호화 된 강력한 임의의 (잠재적으로) 8 자 문자열을 생성합니다 .

echo bin2hex(openssl_random_pseudo_bytes(4));

절차 적 방법 :

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

최신 정보:

PHP7은 random_x()더 나은 기능을 도입했습니다 . PHP 5.X에서 온 경우 PHP 7의 random_bytes ()random_int ()에 대한 폴리 필인 우수한 paragonie / random_compat 라이브러리를 사용하십시오 .

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

7

한 줄 솔루션 :

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

문자열에 다른 길이를 설정하기 위해 substr 매개 변수를 변경할 수 있습니다.


4

ASCII 테이블 을 사용하여 문자 범위를 선택하십시오. 여기서 $ range_start, $ range_end는 ASCII 테이블의 10 진수 열 값입니다.

이 방법은 문자 범위가 다른 문자열 내에서 특별히 정의 된 방법에 비해 더 좋습니다.

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

더보기:


1
영숫자가 아닌 문자가 해당 ACSII 범위에 속하지만 이것은 좋습니다.
Bower 2015 년

4

나는 그것이 오래된 게시물이라는 것을 알고 있지만 Jeremy Ruten의 답변을 기반으로 만들고 의견 제안으로 개선 된 수업에 기여하고 싶습니다.

    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

단순한 녀석들 ....하지만 각 바이트는 0에서 255 사이의 임의의 문자열임을 기억하십시오. 또한 각 바이트를 나타내는 두 문자가 있음을 기억하십시오.

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

단연 최고의 답변과 가장 짧은 코드! 이것은 더 많은 upvotes를 얻을 것입니다
Sliq


2

기능을 가지고 놀기 위해 다음과 같은 빠른 기능을 만들었습니다 range(). 언젠가 누군가를 도울 수 있습니다.

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

다음 코드를 사용할 수 있습니다. 특수 문자 수를 강제 할 수 있다는 점을 제외하면 기존 함수와 유사합니다.

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

이 작업을 수행하는 매우 쉬운 방법을 원한다면 기존 PHP 함수에 의지 할 수 있습니다. 이것은 내가 사용하는 코드입니다.

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

time()epoch 이후 현재 시간을 초 단위 sha1()로 제공하고 0-9a-f 문자열로 암호화 substr()하며 길이를 선택할 수 있습니다. 문자 0에서 시작할 필요는 없으며 두 숫자의 차이가 문자열의 길이가됩니다.



0

Jeremy의 대답은 훌륭합니다. 저처럼 range ()를 구현하는 방법을 잘 모르겠다면 range ()를 사용하여 내 버전을 볼 수 있습니다.

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

이것은 Jeremy와 똑같은 일을하지만 그가 문자열을 사용하는 병합 배열을 사용하고 strlen ()을 사용하는 count ()를 사용합니다.


2
그것은 할 필요가range('a','z');
메디 Karamosly에게

0

1 줄 :

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

0

실제 임의성을 위해 유형 힌트 / rand_int로이를 수행하는 현대적인 방법

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

먼저 원하는 문자를 나열하십시오.

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

str_shuffle ($ string) 함수를 사용하십시오. 이 기능은 무작위로 섞인 문자열을 제공합니다.

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

50은 문자열의 길이입니다.


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

소문자와 대문자 문자열의 문자 수가 다릅니다. 그리고이 코드는 이미 여기에 게시 된 다른 모든 변형에 비해 장점이 있습니까?
magras
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.