关于php:生成(伪)随机字母数字字符串

关于php:生成(伪)随机字母数字字符串

Generating (pseudo)random alpha-numeric strings

如何生成(伪)随机字母数字字符串,例如:PHP中的" d79jd8c"?


首先用所有可能的字符组成一个字符串:

1
 $characters = 'abcdefghijklmnopqrstuvwxyz0123456789';

您还可以使用range()更快地完成此操作。

然后,在一个循环中,选择一个随机数并将其用作$characters字符串的索引以获取随机字符,然后将其附加到您的字符串中:

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

$random_string_length是随机字符串的长度。


我喜欢这项功能

1
2
3
4
5
6
7
8
9
10
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);


使用openssl_random_pseudo_bytes函数生??成具有加密强度的随机(可能)8个字符的字符串:

1
echo bin2hex(openssl_random_pseudo_bytes(4));

程序方式:

1
2
3
4
function randomString(int $length): string
{
    return bin2hex(openssl_random_pseudo_bytes($length));
}

更新:

PHP7引入了random_x()函数,它应该更好。如果您来自PHP 5.X,请使用出色的paragonie / random_compat库,它是PHP 7中random_bytes()和random_int()的填充。

1
2
3
4
function randomString($length)
{
    return bin2hex(random_bytes($length));
}

一线解决方案:

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

您可以更改substr参数,以便为字符串设置不同的长度。


我知道这是一篇过时的文章,但是我想为我根据杰里米·鲁滕的回答创建的课程做出贡献,并通过注释中的建议进行改进:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    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;

      }

    }

使用ASCII表选择一个字母范围,其中:$ range_start,$ range_end是ASCII表中十进制列中的值。

我发现,与描述的方法相比,该方法更好,在其他字符串中专门定义了字符范围。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 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;

查看更多:

  • chr功能
  • mt_rand函数


简单的家伙.....但请记住,每个字节都是0到255之间的随机字节,对于一个随机字符串来说就可以了。还要记住,您将有两个字符代表每个字节。

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

也许我在这里错过了一些东西,但是这是使用uniqid()函数的一种方法。


我做了以下快速功能,只是为了配合range()功能。它可能会在某个时候帮助某人。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}

如果您想要一种非常简单的方法来执行此操作,则可以依靠现有的PHP函数。这是我使用的代码:

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

time()为您提供自纪元以来的当前时间(以秒为单位),sha1()将其加密为0-9a-f的字符串,而substr()使您可以选择长度。您不必从字符0开始,并且两个数字之间的任何区别都将是字符串的长度。


1
2
3
4
5
6
7
8
9
10
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function random_string()
{
    // 8 characters: 7 lower-case alphabets and 1 digit
    $character_set_array = array();
    $character_set_array[] = array('count' => 7, 'characters' => 'abcdefghijklmnopqrstuvwxyz');
    $character_set_array[] = array('count' => 1, 'characters' => '0123456789');
    $temp_array = array();
    foreach ($character_set_array as $character_set) {
        for ($i = 0; $i < $character_set['count']; $i++) {
            $temp_array[] = $character_set['characters'][rand(0, strlen($character_set['characters']) - 1)];
        }
    }
    shuffle($temp_array);
    return implode('', $temp_array);
}

使用提示/ rand_int类型实现真正随机性的现代方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
}

1行:

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

这是我使用的东西:

1
2
3
4
$cryptoStrong = true; // can be false
$length = 16; // Any length you want
$bytes = openssl_random_pseudo_bytes($length, $cryptoStrong);
$randomString = bin2hex($bytes);

您可以在此处查看openssl_random_pseudo_bytes的文档,并在此处查看bin2hex的文档


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}


首先列出所需的字符

1
$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

使用str_shuffle($ string)函数。此函数将为您提供随机混洗的字符串。

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

50是字符串的长度。


杰里米的答案很好。如果像我一样不确定如何实现range(),则可以使用range()查看我的版本。

1
2
3
4
5
6
7
8
<?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()。


推荐阅读

    linux图形转字符命令?

    linux图形转字符命令?,系统,电脑,密码,界面,情况,地方,工具,图形界面,字符,

    linux隐藏字符的命令?

    linux隐藏字符的命令?,工作,地址,系统,发行,信息,标准,管理,命令,目录,文件,

    添加字符串命令linux?

    添加字符串命令linux?,情况,名称,文件,位置,名字,地方,连续,信息,命令,内容,L

    linux命令行大字符?

    linux命令行大字符?,工作,地址,系统,信息,管理,第一,发行,在线,最新,标准,lin

    linux排序数字命令?

    linux排序数字命令?,标准,数字,单位,情况,系统,信息,命令,文件,顺序,参数,lin

    linux命令不能打数字?

    linux命令不能打数字?,工作,密码,数字,地址,电脑,系统,命令,设备,下来,预期,

    linux命令查找字符串?

    linux命令查找字符串?,工具,信息,命令,字符串,系统,工作,文件,范本,样式,文

    linux命令字符搜索?

    linux命令字符搜索?,系统,工具,命令,灵活,信息,工作,字符串,文本,文件,模式,l

    linux大写字符命令?

    linux大写字符命令?,系统,工作,信息,档案,数字,地址,命令,名称,密码,时间,lin

    linux字符匹配命令?

    linux字符匹配命令?,工作,地址,管理,系统,工具,标准,命令,目录,信息,文件,Lin

    linux字符替换命令?

    linux字符替换命令?,系统,数据,软件,字符串,文件,命令,实时,首次,位置,工作,l

    linux删除字符的命令?

    linux删除字符的命令?,系统,软件,名称,文件,档案,不了,命令,字符,目录,字母,l

    linux命令行字符错乱?

    linux命令行字符错乱?,系统,亚洲,第一,不了,状态,异常,软件,管理,字符,命令,l

    linux字符命令界面?

    linux字符命令界面?,系统,密码,位置,首页,工具,情况,终端,服务,评论,电脑,lin

    linux字母过滤命令?

    linux字母过滤命令?,工具,系统,工作,地址,信息,命令,灵活,文本,字符串,文件,L

    linux生成数字命令?

    linux生成数字命令?,密码,数字,设备,环境,名称,时间,单位,地址,信息,系统,求

    linux按字符排序命令?

    linux按字符排序命令?,标准,命令,时间,情况,文件,数字,基础,状态,系统,功能,i

    在linux中的命令字符?

    在linux中的命令字符?,标准,信息,命令,文件,系统,数据,字符串,变量,内容,除

    linux替换字符命令?

    linux替换字符命令?,系统,资料,首次,命令,字符串,表示,内容,字符,批量,文件,L

    linux字符管理命令?

    linux字符管理命令?,系统,工作,管理,地址,信息,命令,情况,标准,数据,发行,Lin