Tạo chuỗi ký tự chữ và số ngẫu nhiên (giả)


85

Làm cách nào để tạo một chuỗi chữ-số ngẫu nhiên (giả), chẳng hạn như: 'd79jd8c' trong PHP?


Giải pháp ngắn gọn và độc đáo. Tham khảo Liên kết này stackoverflow.com/a/34467730/4345141
Saud Khan

Phương pháp Random::alphanumericString($length)làm những gì bạn muốn. Nếu bạn muốn tự xây dựng cái này, đừng sử dụng bất kỳ nguồn ngẫu nhiên nào khác ngoài random_byteshoặc được tích hợp sẵn của PHP random_int.
caw

Câu trả lời:


164

Đầu tiên hãy tạo một chuỗi với tất cả các ký tự có thể có của bạn:

 $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';

Bạn cũng có thể sử dụng range () để thực hiện việc này nhanh hơn.

Sau đó, trong một vòng lặp, hãy chọn một số ngẫu nhiên và sử dụng nó làm chỉ mục cho $characterschuỗi để lấy một ký tự ngẫu nhiên và nối nó vào chuỗi của bạn:

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

$random_string_length là độ dài của chuỗi ngẫu nhiên.


9
Việc triển khai này cũng rất hay nếu bạn muốn xóa các ký tự trông giống nhau như "l" và "1", "O" và "0". Điều này rất đáng giá khi tạo mật khẩu mới cho người dùng.
Mark Nold 07/09/08

10
Tôi cũng sử dụng kỹ thuật này và loại bỏ tất cả các nguyên âm để không vô tình đưa cho ai đó một mật khẩu nào đó thô lỗ.
nickf

10
Cải tiến nhỏ: mt_rand()là sự thay thế thả xuống rand()và tốt hơn.
Grilse

11
Thực hiện strlen()mỗi lần lặp lại không tốt. Gán strlen($characters) - 1cho một biến và thực hiện strlen ngoài chu trình. Không quan trọng trong trường hợp này, nhưng nó chỉ là Mauvais tấn .
mintobit

6
Cân nhắc sử dụng random_int nếu bạn cần một ngẫu nhiên an toàn bằng mật mã.
truenice

18

Tôi thích chức năng này cho công việc

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

Tạo chuỗi 8 ký tự ngẫu nhiên, mạnh mẽ về mặt mật mã bằng cách sử dụng hàm openssl_random_pseudo_bytes :

echo bin2hex(openssl_random_pseudo_bytes(4));

Cách thủ tục:

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

Cập nhật:

PHP7 đã giới thiệu các random_x()chức năng thậm chí còn tốt hơn. Nếu bạn đến từ PHP 5.X, hãy sử dụng thư viện paragonie / random_compat tuyệt vời , là một polyfill cho random_bytes ()random_int () từ PHP 7.

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

7

Giải pháp một dòng:

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

Bạn có thể thay đổi tham số substr để đặt độ dài khác cho chuỗi của mình.


4

Sử dụng bảng ASCII để chọn một dải các chữ cái, trong đó: $ range_start, $ range_end là một giá trị từ cột thập phân trong bảng ASCII.

Tôi thấy rằng phương pháp này đẹp hơn so với phương pháp được mô tả trong đó phạm vi ký tự được xác định cụ thể trong một chuỗi khác.

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

Xem thêm:


1
Điều này rất hay mặc dù các ký tự không phải chữ và số nằm trong phạm vi ACSII đó.
Bower

4

Tôi biết đó là một bài đăng cũ nhưng tôi muốn đóng góp bằng một lớp học mà tôi đã tạo dựa trên câu trả lời của Jeremy Ruten và được cải thiện bằng các đề xuất trong nhận xét:

    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

Các bạn đơn giản .... nhưng hãy nhớ mỗi byte là ngẫu nhiên từ 0 đến 255 mà đối với một chuỗi ngẫu nhiên sẽ ổn. Cũng nên nhớ bạn sẽ có hai ký tự để đại diện cho mỗi byte.

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

Cho đến nay câu trả lời tốt nhất và mã ngắn nhất! Điều này sẽ nhận được nhiều
ủng hộ


2

Tôi đã tạo một hàm nhanh sau đây chỉ để chơi với range()hàm. Nó chỉ có thể giúp ai đó đôi khi.

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

Bạn có thể sử dụng mã sau. Nó tương tự như các hàm hiện có ngoại trừ việc bạn có thể buộc đếm ký tự đặc biệt:

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

Nếu bạn muốn một cách rất dễ dàng để thực hiện việc này, bạn có thể dựa vào các hàm PHP hiện có. Đây là mã tôi sử dụng:

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

time()cung cấp cho bạn thời gian hiện tại tính bằng giây kể từ kỷ nguyên, sha1()mã hóa nó thành chuỗi 0-9a-f và substr()cho phép bạn chọn độ dài. Bạn không phải bắt đầu từ ký tự 0 và bất kỳ sự khác biệt nào giữa hai số sẽ là độ dài của chuỗi.



0

Câu trả lời của Jeremy rất tuyệt. Nếu, giống như tôi, bạn không chắc chắn về cách triển khai range (), bạn có thể xem phiên bản của tôi bằng cách sử dụng 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;
?>

Điều này thực hiện tương tự như của Jeremy nhưng sử dụng các mảng đã hợp nhất trong đó anh ta sử dụng một chuỗi và sử dụng count () trong đó anh ta sử dụng strlen ().


2
nó cần phải đượcrange('a','z');
Mehdi Karamosly

0

1 dòng:

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

0

Cách hiện đại để làm điều đó với kiểu gợi ý / rand_int để có độ ngẫu nhiên thực sự

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

Đầu tiên liệt kê các ký tự mong muốn

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

Sử dụng hàm str_shuffle ($ string). Chức năng này sẽ cung cấp cho bạn một chuỗi được xáo trộn ngẫu nhiên.

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

50 là Chiều dài của chuỗi.


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

Bạn có số ký tự khác nhau trong chuỗi chữ thường và chữ hoa. Và mã này có bất kỳ lợi thế nào so với tất cả các biến thể khác đã được xuất bản ở đây không?
magras
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.