PHP随机字符串生成器

时间:2010-12-04 22:56:21

标签: php string random

我正在尝试在PHP中创建一个随机字符串,我绝对没有输出:

<?php
function RandomString()
{
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randstring = '';
    for ($i = 0; $i < 10; $i++) {
        $randstring = $characters[rand(0, strlen($characters))];
    }
    return $randstring;
}
RandomString();
echo $randstring;

我做错了什么?

62 个答案:

答案 0 :(得分:1277)

具体回答这个问题,有两个问题:

    当你回应它时,
  1. $randstring不在范围内。
  2. 字符不会在循环中连接在一起。
  3. 以下是带有更正的代码段:

    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 the random string.
    // Optionally, you can give it a desired string length.
    echo generateRandomString();
    
      

    请注意,这会产生可预测的随机字符串。如果您想创建安全令牌,请see this answer

答案 1 :(得分:347)

  

注意:str_shuffle()内部使用rand(),这不适合加密目的(例如生成随机密码)。你想要一个secure random number generator。它也不允许重复字符。

还有一种方式。

更新 (现在生成任意长度的字符串):

function generateRandomString($length = 10) {
    return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}

echo  generateRandomString();  // OR: generateRandomString(24)

就是这样。 :)

答案 2 :(得分:287)

这个问题有很多答案,但没有一个利用Cryptographically Secure Pseudo-Random Number Generator(CSPRNG)。

简单,安全和正确的答案是使用RandomLib并且不要重新发明轮子。

对于那些坚持发明自己的解决方案的人,PHP 7.0.0将为此目的提供random_int();如果你仍然使用PHP 5.x,我们写了一个PHP 5 polyfill for random_int(),这样你甚至可以在升级到PHP 7之前使用新的API。

Safely generating random integers in PHP不是一项微不足道的任务。在生产中部署本地算法之前,应始终使用your resident StackExchange cryptography experts进行检查。

使用安全整数生成器,使用CSPRNG生成随机字符串就是在公园散步。

创建安全的随机字符串

/**
 * Generate a random string, using a cryptographically secure 
 * pseudorandom number generator (random_int)
 * 
 * For PHP 7, random_int is a PHP core function
 * For PHP 5.x, depends on https://github.com/paragonie/random_compat
 * 
 * @param int $length      How many characters do we want?
 * @param string $keyspace A string of all possible characters
 *                         to select from
 * @return string
 */
function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
    $pieces = [];
    $max = mb_strlen($keyspace, '8bit') - 1;
    for ($i = 0; $i < $length; ++$i) {
        $pieces []= $keyspace[random_int(0, $max)];
    }
    return implode('', $pieces);
}

<强>用法

$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');

演示https://3v4l.org/b4PST(忽略PHP 5失败;需要random_compat)

答案 3 :(得分:128)

创建一个20字符长的hexdec字符串:

$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars

在PHP 7中(random_bytes()):

$string = base64_encode(random_bytes(10)); // ~14 chars, includes /=+
// or
$string = substr(str_replace(['+', '/', '='], '', base64_encode(random_bytes(32))), 0, 32); // 32 chars, without /=+
// or
$string = bin2hex(random_bytes(10)); // 20 chars, only 0-9a-f

答案 4 :(得分:82)

@tasmaniski:你的回答对我有用。我有同样的问题,我建议那些一直在寻找相同答案的人。这是来自@tasmaniski:

<?php 
    $random = substr(md5(mt_rand()), 0, 7);
    echo $random;
?>

答案 5 :(得分:43)

根据您的应用程序(我想生成密码),您可以使用

$string = base64_encode(openssl_random_pseudo_bytes(30));

作为base64,它们可能包含=-以及请求的字符。你可以生成一个更长的字符串,然后过滤并修剪它以删除它们。

openssl_random_pseudo_bytes似乎是在php中生成适当随机数的推荐方法。为什么rand不使用/dev/random我不知道。

答案 6 :(得分:25)

我知道游戏可能有点晚了,但是这里有一个简单的单行程序,它可以生成一个真正的随机字符串,而不需要任何脚本级循环或使用openssl库。

echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))),1,10);

将其分解以使参数清晰

// Character List to Pick from
$chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

// Minimum/Maximum times to repeat character List to seed from
$chrRepeatMin = 1; // Minimum times to repeat the seed string
$chrRepeatMax = 10; // Maximum times to repeat the seed string

// Length of Random String returned
$chrRandomLength = 10;

// The ONE LINE random command with the above variables.
echo substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin,$chrRepeatMax))),1,$chrRandomLength);

此方法通过随机重复字符列表,然后混合组合字符串,并返回指定的字符数来工作。

您可以通过随机化返回的字符串的长度,将$chrRandomLength替换为mt_rand(8, 15)(对于8到15个字符之间的随机字符串)来进一步随机化。

答案 7 :(得分:24)

function generateRandomString($length = 15)
{
    return substr(sha1(rand()), 0, $length);
}

多田!

答案 8 :(得分:23)

实现此功能的更好方法是:

function RandomString($length) {
    $keys = array_merge(range(0,9), range('a', 'z'));

    $key = "";
    for($i=0; $i < $length; $i++) {
        $key .= $keys[mt_rand(0, count($keys) - 1)];
    }
    return $key;
}

echo RandomString(20);
根据php7中的thisthis

mt_rand更随机。 rand函数是mt_rand的别名。

答案 9 :(得分:21)

PHP 7 + 使用random_bytes函数生成加密安全的随机字节。

$bytes = random_bytes(16);
echo bin2hex($bytes);

可能的输出

da821217e61e33ed4b2dd96f8439056c


PHP 5.3 + 使用openssl_random_pseudo_bytes函数生成伪随机字节。

$bytes = openssl_random_pseudo_bytes(16);
echo bin2hex($bytes);

可能的输出

e2d1254506fbb6cd842cd640333214ad


最佳用例可能是

function getRandomBytes($length = 16)
{
    if (function_exists('random_bytes')) {
        $bytes = random_bytes($length / 2);
    } else {
        $bytes = openssl_random_pseudo_bytes($length / 2);
    }
    return bin2hex($bytes);
}
echo getRandomBytes();

可能的输出

ba8cc342bdf91143

答案 10 :(得分:19)

函数作用域中的

$randstring与您调用它的作用域不同。您必须将返回值分配给变量。

$randstring = RandomString();
echo $randstring;

或直接回显返回值:

echo RandomString();

另外,在你的功能中你有一点错误。在for循环中,您需要使用.=,以便每个字符都附加到字符串中。通过使用=,您将使用每个新字符覆盖它而不是附加。

$randstring .= $characters[rand(0, strlen($characters))];

答案 11 :(得分:14)

首先,您定义要使用的字母:

$alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$special  = '~!@#$%^&*(){}[],./?';
$alphabet = $alphanum . $special;

然后,使用openssl_random_pseudo_bytes()生成适当的随机数据:

$len = 12; // length of password
$random = openssl_random_pseudo_bytes($len);

最后,您使用此随机数据来创建密码。由于$random中的每个字符都可以chr(0)chr(255),因此代码会使用$alphabet_length除以序数值后的余数,以确保只挑选字母表中的字符(注意这样做会影响随机性):

$alphabet_length = strlen($alphabet);
$password = '';
for ($i = 0; $i < $len; ++$i) {
    $password .= $alphabet[ord($random[$i]) % $alphabet_length];
}

或者,通常更好的方法是使用RandomLibSecurityLib

use SecurityLib\Strength;

$factory = new RandomLib\Factory;
$generator = $factory->getGenerator(new Strength(Strength::MEDIUM));

$password = $generator->generateString(12, $alphabet);

答案 12 :(得分:10)

我测试了那里最流行的功能的性能,在我的盒子上生成1'000'000个32个符号的字符串所需的时间是:

2.5 $s = substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,32);
1.9 $s = base64_encode(openssl_random_pseudo_bytes(24));
1.68 $s = bin2hex(openssl_random_pseudo_bytes(16));
0.63 $s = base64_encode(random_bytes(24));
0.62 $s = bin2hex(random_bytes(16));
0.37 $s = substr(md5(rand()), 0, 32);
0.37 $s = substr(md5(mt_rand()), 0, 32);

请注意它确实存在多长时间并不重要但速度较慢哪一个更快,因此您可以根据您的要求选择加密准备等。

为了准确起见,如果你需要的字符串短于32个符号,则添加

MD5周围的substr()。

为了回答:字符串没有连接但是被覆盖,并且没有存储函数的结果。

答案 13 :(得分:9)

简短方法..

以下是生成随机字符串的最简短方法

<?php
echo $my_rand_strng = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), -15); 

echo substr(md5(rand()), 0, 7);

echo str_shuffle(MD5(microtime()));
?>

答案 14 :(得分:7)

这是取自adminer sources

/** Get a random string
* @return string 32 hexadecimal characters
*/
function rand_string() {
    return md5(uniqid(mt_rand(), true));
}

Adminer,用PHP编写的数据库管理工具。

答案 15 :(得分:7)

function rndStr($len = 64) {
     $randomData = file_get_contents('/dev/urandom', false, null, 0, $len) . uniqid(mt_rand(), true);
     $str = substr(str_replace(array('/','=','+'),'', base64_encode($randomData)),0,$len);
    return $str;
}

答案 16 :(得分:6)

一种非常快速的方法是做一些事情:

substr(md5(rand()),0,10);

这将生成一个长度为10个字符的随机字符串。当然,有些人可能会说它在计算方面有点沉重,但现在处理器已经过优化,可以非常快速地运行md5或sha256算法。当然,如果rand()函数返回相同的值,结果将是相同的,具有1/32767的相同概率。如果安全性是问题,那么只需将rand()更改为mt_rand()

答案 17 :(得分:6)

Laravel 5框架中的Helper功能

/**
 * Generate a "random" alpha-numeric string.
 *
 * Should not be considered sufficient for cryptography, etc.
 *
 * @param  int  $length
 * @return string
 */
function str_random($length = 16)
{
    $pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    return substr(str_shuffle(str_repeat($pool, $length)), 0, $length);
}

答案 18 :(得分:5)

/**
 * @param int $length
 * @param string $abc
 * @return string
 */
function generateRandomString($length = 10, $abc = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
{
    return substr(str_shuffle($abc), 0, $length);
}

来自http://www.xeweb.net/2011/02/11/generate-a-random-string-a-z-0-9-in-php/

的来源

答案 19 :(得分:4)

该函数的编辑版本工作正常,我找到了一个问题:你使用了错误的字符来包含$字符,因此'字符有时是生成的随机字符串的一部分。

要解决此问题,请更改:

$characters = ’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;

为:

$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

这种方式只使用包含的字符,'字符永远不会是生成的随机字符串的一部分。

答案 20 :(得分:4)

自php7起,就存在random_bytes函数。 https://www.php.net/manual/ru/function.random-bytes.php 这样您就可以生成这样的随机字符串

<?php
$bytes = random_bytes(5);
var_dump(bin2hex($bytes));
?>

答案 21 :(得分:4)

一行。
快速的巨大字符串,具有一定的独特性。

function random_string($length){
    return substr(str_repeat(md5(rand()), ceil($length/32)), 0, $length);
}

答案 22 :(得分:4)

另一个单行,生成随机字符串,包含10个字母和数字字符。它将创建一个带有range的数组(调整第二个参数来设置大小),循环遍历此数组并分配一个随机的ascii-char(范围0-9或az),然后内爆数组以获取字符串

$str = implode('', array_map(function () { return chr(rand(0, 1) ? rand(48, 57) : rand(97, 122)); }, range(0, 9)));

注意:仅适用于PHP 5.3 +

答案 23 :(得分:3)

我喜欢使用openssl_random_pseudo_bytes的最后一条评论,但它不是我的解决方案,因为我仍然需要删除我不想要的字符,而且我无法获得设置长度的字符串。这是我的解决方案......

function rndStr($len = 20) {
    $rnd='';
    for($i=0;$i<$len;$i++) {
        do {
            $byte = openssl_random_pseudo_bytes(1);
            $asc = chr(base_convert(substr(bin2hex($byte),0,2),16,10));
        } while(!ctype_alnum($asc));
        $rnd .= $asc;
    }
    return $rnd;
}

答案 24 :(得分:3)

function randomString($length = 5) {
       return substr(str_shuffle(implode(array_merge(range('A','Z'), range('a','z'), range(0,9)))), 0, $length);
}

答案 25 :(得分:3)

这是另一种解决方案。

function genRandomString($length = 10)
{
    if($length < 1)
        $length = 1;
    return substr(preg_replace("/[^A-Za-z0-9]/", '', base64_encode(openssl_random_pseudo_bytes($length * 2))), 0, $length);
}

PS。我在Ubuntu上使用PHP 7.2。

答案 26 :(得分:2)

有更好的替代方案,很多已经发布,所以我只给你回复你的东西

<?php
function RandomString()
{
    global $randstring ;
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randstring = '';
    for ($i = 0; $i < 10; $i++) {
        $randstring .= $characters[rand(0, strlen($characters))];
    }
    return $randstring;
}

RandomString();

echo $randstring;
?>

您可能也感兴趣:

<?php 


    function RandomString()
    {
        global $randstring ;
        $characters = str_split('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
        array_filter ($characters,function($var)use($characters,&$randstring){
                $randstring .= $characters[rand(0, count($characters)-1)];
        });
        return $randstring;
    }

    RandomString();echo $randstring.'<hr>';

    //.. OR  ..
    $randstring='';echo(RandomString());

    ?>

或其他人:

<?php

function s($length){
  for($i=0;($i<$length)and(($what=rand(1,3))and( (($what==1)and($t=rand(48,57) ))or (($what==2)and ($t=rand(65,90))) or (($what==3)and ($t=rand(97,122)))  ) and  (print chr($t)));$i++);
}
s(10);

?>

答案 27 :(得分:2)

仅使用 PHP本机函数进行参数化单线程,自 PHP 5.1.0

以来一直在工作
str_shuffle(implode('', (array_intersect_key(($map =  array_map('chr', array_merge(array_map('mt_rand', array_fill(0, $length = 25, 48), array_fill(0,$length,57)),array_map('mt_rand', array_fill(0, $length, 65), array_fill(0,$length,90)),array_map('mt_rand', array_fill(0, $length, 97), array_fill(0,$length,122))))), array_flip($keys = array_rand($map, $length))))))

答案 28 :(得分:2)

PHP中生成随机字符串的另一种方法是:

function RandomString($length) {
    $original_string = array_merge(range(0,9), range('a','z'), range('A', 'Z'));
    $original_string = implode("", $original_string);
    return substr(str_shuffle($original_string), 0, $length);
}
echo RandomString(6);

答案 29 :(得分:2)

这是我简单的单行解决方案,用于生成使用友好的随机密码,排除类似于“ 1”和“ l”,“ O”和“ 0”等类似的字符,这里是5个字符,但是您当然可以轻松更改它:

$user_password = substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789'),0,5);

答案 30 :(得分:2)

有一个简单的代码:

echo implode("",array_map(create_function('$s','return substr($s,mt_rand(0,strlen($s)),1);'),array_fill(0,16,"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")));

有简单的指南:

  • 要更改字符串的长度,请仅将16更改为其他值。
  • 要从不同的字符中选择,请更改字符串。

答案 31 :(得分:2)

来自yii2框架

/**
 * Generates a random string of specified length.
 * The string generated matches [A-Za-z0-9_-]+ and is transparent to URL-encoding.
 *
 * @param int $length the length of the key in characters
 * @return string the generated random key
 */

function generateRandomString($length = 10) {
    $bytes = random_bytes($length);
    return substr(strtr(base64_encode($bytes), '+/', '-_'), 0, $length);
}

答案 32 :(得分:1)

一种解决方案是

Adj Close

答案 33 :(得分:1)

通过这种方法,您可以在创建时选择字符长度。

<?php
$random_string="";
$character_count=12;
for($i=1; $i<=$character_count; $i++)
{
$random_string.=chr(rand(97,122));
}
echo $random_string;
?>

答案 34 :(得分:1)

这里是单线。您将至少获得一个小写字母,一个大写字母,一个数字和一个符号。使用应该random_int进行密码学加密的方式。不过,我并不认为这是安全的。我不是安全专家。

要复制并粘贴:

 for ($chars = array('0123456789','abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ','!@#$%^&*()_+-='),$randomString="",$i=0;$i<12;$i++)$randomString .= substr($chars[$i%4], random_int(0,strlen($chars[$i%4])), 1);

还有更多细分:

for (
        $chars = array('0123456789','abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ','!@#$%^&*()_+-='),
        $randomString="",
        $i=0;
        $i<12;$i++)
        $randomString .= 
            substr($chars[$i%4], 
                random_int(0, strlen($chars[$i%4])), 1);

我在循环中使用$chars[$i%4]选择要从中获取随机字符的集合。它可以保证数组中每个字符集都包含多个字符。

它肯定可以改进(随机分配每个字符集有多少个),但是对于我的目的来说已经足够了。

答案 35 :(得分:1)

我知道这是一个有多个答案的老问题,但我可以尝试发布解决方案...使用此函数生成自定义随机字母数字字符串...

<?php
  function random_alphanumeric($length) {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12345689';
    $my_string = '';
    for ($i = 0; $i < $length; $i++) {
      $pos = mt_rand(0, strlen($chars) -1);
      $my_string .= substr($chars, $pos, 1);
    }
    return $my_string;
  }
  $test = random_alphanumeric(50); // 50 characters
  echo $test;
?>

示例(测试):Y1FypdjVbFCFK6Gh9FDJpe6dciwJEfV6MQGpJqAfuijaYSZ86

如果您需要两个或多个唯一的字符串,则可以执行此操作...

  $string_1 = random_alphanumeric(50);
  $string_2 = random_alphanumeric(50);
  while ($string_1 == $string_2) {
    $string_1 = random_alphanumeric(50);
    $string_2 = random_alphanumeric(50);
    if ($string_1 != $string_2) {
       break;
    }
  }
  echo $string_1;
  echo "<br>\n";
  echo $string_2;

$ string_1:KkvUwia8rbDEV2aChWqm3AgeUZqyrRbUx2AxVhx5s4TSJ2VwA4

$ string_2:XraO85YfxBBCInafvwipSOJwLmk6JMWiuWOxYQDnXohcn2D8K6

我希望有帮助。

答案 36 :(得分:1)

具有上述讨论中某些功能的课程。

$options['numeric'] = true;
$options['uppercase'] = true;
$options['lowercase'] = true;
$new = new RandomString($options);




class RandomString
{
    /**
     * @var array
     */
    private $default = ['numeric' => true, 'uppercase' => true, 'lowercase' => true];

    /**
     * @var array
     */
    private $options;

    /**
     * array
     */
    private $whitelist = ['numeric', 'uppercase', 'lowercase'];

    /**
     * RandomString constructor.
     *
     * @param array $options
     */
    public function __construct(array $options = [])
    {
        $this->options = $this->default;
        if(!empty($options))
        {
            $options = array_intersect_key($options, array_flip($this->whitelist));
            if(empty($options))
            {
                $this->options = $this->default;
            }else
            {
                $this->options = $options;
            }
        }

    }

    /**
     * @return string
     */
    private function returnCharacters(){

        $options = $this->options;

        $numbers = '0123456789';
        $uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $lowercase = "abcdefghijklmnopqrstuvwxyz";

        $characters = '';
        if(isset($options['numeric']) && $options['numeric'] === true){
            $characters .= $numbers;
        }

        if(isset($options['uppercase']) && $options['uppercase'] === true){
            $characters .= $uppercase;
        }

        if(isset($options['lowercase']) && $options['lowercase'] === true){
            $characters .= $lowercase;
        }
        return $characters;

    }

    /**
     * @param $length
     * @param $quantity
     * @return string
     */
    public function randomString($length, $quantity) {

        $string = '';
        $characters = $this->returnCharacters();

        for ($j = 0; $j < $quantity; $j++) {
            for($i = 0; $i < $length; $i++){
                $string .= $characters[mt_rand(0, strlen($characters) - 1)];
            }
            $string .= "\n";
        }
        return $string;
    }

    /**
     * @return array
     */
    public function getOptions()
    {
        return $this->options;
    }

    /**
     * @return mixed
     */
    public function getWhitelist()
    {
        return $this->whitelist;
    }

答案 37 :(得分:1)

最后我找到了一个获得随机和独特价值的解决方案 我的解决方案是

substr(md5(time()), 0, 12)

时间总是返回timstamp,它始终是唯一的。您可以将它与md5一起使用以使其更好。

答案 38 :(得分:1)

function generateRandomString($length = 10, $hasNumber = true, $hasLowercase = true, $hasUppercase = true): string
{
    $string = '';
    if ($hasNumber)
        $string .= '0123456789';
    if ($hasLowercase)
        $string .= 'abcdefghijklmnopqrstuvwxyz';
    if ($hasUppercase)
        $string .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    return substr(str_shuffle(str_repeat($x = $string, ceil($length / strlen($x)))), 1, $length);
}

并使用:

echo generateRandomString(32);

答案 39 :(得分:1)

function getRandomString($length) {
  $salt = array_merge(range('a', 'z'), range(0, 9));
  $maxIndex = count($salt) - 1;

  $result = '';
  for ($i = 0; $i < $length; $i++) {
    $index = mt_rand(0, $maxIndex);
    $result .= $salt[$index];
  }
  return $result
}

答案 40 :(得分:1)

以下是我如何获取真正的唯一随机密钥:

$Length = 10;
$RandomString = substr(str_shuffle(md5(time())), 0, $Length);
echo $RandomString;

你可以使用time(),因为它是一个Unix时间戳,并且与上面提到的其他随机数相比总是唯一的。然后,您可以生成其中的md5sum,并从生成的MD5字符串中获取所需的长度。在这种情况下,我使用10个字符,如果我想让它更独特,我可以使用更长的字符串。

我希望这会有所帮助。

答案 41 :(得分:1)

你这样做是完全错误的,因为你依赖于数字而不是字符,我不确定你是否希望随机输出只是数字,如果是这样,为什么需要获得所有字母和所有数字并提取他们的长度?为什么不使用rand(0, 62)?,即使您在声明函数之前忘记初始化变量$randstring

无论如何,PHP为此提供了非常方便的功能str_shuffle(),这是一个适合您需要的示例。

&#13;
&#13;
<?php

function randomString() {
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    return str_shuffle($characters);
}
echo randomString();
&#13;
&#13;
&#13;

答案 42 :(得分:1)

<?php
    /**
     * Creates a random string
     *
     * @param (int) $length
     *   Length in characters
     * @param (array) $ranges
     *   (optional) Array of ranges to be used
     *
     * @return
     * Random string
    */
    function random_string($length, $ranges = array('0-9', 'a-z', 'A-Z')) {
        foreach ($ranges as $r) $s .= implode(range(array_shift($r = explode('-', $r)), $r[1]));
        while (strlen($s) < $length) $s .= $s;
        return substr(str_shuffle($s), 0, $length);
    }

    // Examples:
    $l = 100;
    echo '<b>Default:</b> ' . random_string($l) . '<br />';
    echo '<b>Lower Case only:</b> ' . random_string($l, array('a-z')) . '<br />';
    echo '<b>HEX only:</b> ' . random_string($l, array('0-9', 'A-F')) . '<br />';
    echo '<b>BIN only:</b> ' . random_string($l, array('0-1')) . '<br />';

/* End of file */

答案 43 :(得分:1)

来源:PHP Function that Generates Random Characters

这个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);

答案 44 :(得分:1)

以下函数生成任何长度的伪字符串。

/**
 * Returns random string of a given length.
 */
function get_random_string($length) {
  $pull = [];
  while (count($pull) < $length) {
    $pull = array_merge($pull, range(0, 9), range('a', 'z'), range('A', 'Z'));
  }
  shuffle($pull);
  return substr(implode($pull), 0, $length);
}

答案 45 :(得分:0)

你好,你可以试试这个

<?php


function random($len){

    $char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

    // ----------------------------------------------
    // number of possible combinations
    // ----------------------------------------------
    $pos = strlen($char);
    $pos = pow($pos, $len);
    echo $pos.'<br>';
    // ----------------------------------------------

    $total = strlen($char)-1;
    $text = "";

    for ($i=0; $i<$len; $i++){
        $text = $text.$char[rand(0, $total)];
    }

    return $text;

}


$string = random(15);
echo $string;



?>

你也可以按时使用md5,但要小心 您需要使用microtime()而不是time()函数,因为如果多个线程在同一秒内运行,则需要为所有线程获取不同的字符串。

<?php

    $string = md5( microtime() );
    echo $string;

?>

答案 46 :(得分:0)

function strgen($len) {
    $buf = '';
    for ($i = 0; $i < $len; $i++) {
        $j = mt_rand(0, 61);
        if ($j >= 36) {
            $j += 13;
        } else if ($j >= 10) {
            $j += 7;
        }
        $buf .= chr(48 + $j);
    }
    return $buf;
}

简单而优雅。

答案 47 :(得分:0)

您的代码有3处错误:

  1. $ randstring未分配任何内容(仅在超出范围的函数内部)。
  2. RandomString仅返回最后一个随机字符。将 "_all": { "enabled": "true" } 替换为=
  3. .=不会生成加密安全的伪随机数。请改用Rand

参见下文:

random_int

答案 48 :(得分:0)

function randomName($length = 8) {
  $values = array_merge(range(65, 90), range(97, 122), range(48, 57));
  $max = count($values) - 1;
  $str = chr(mt_rand(97, 122));
  for ($i = 1; $i < $length; $i++) {
    $str .= chr($values[mt_rand(0, $max)]);
  }
  return $str;
}

答案 49 :(得分:0)

function randomString() {
       return md5(rand(100, 200));
}

答案 50 :(得分:0)

如果您正在使用PHP 7 +

public function generateRandom(){

$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars

// OR

$string = base64_encode(random_bytes(10)); // ~14 characters, includes /=+

// or

$string = substr(str_replace(['+', '/', '='], '', base64_encode(random_bytes(32))), 0, 32); // 32 characters, without /=+

// or

$string = bin2hex(random_bytes(10)); // 20 characters, only 0-9a-f

}

答案 51 :(得分:0)

尝试一下,它最多可以生成母版的长度。但它简单且适合于小字符串。

$master="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$master_array = str_split($master);
shuffle($master_array);
print_r(implode("",array_slice($master_array,0,10)));

答案 52 :(得分:0)

此代码将帮助:

此函数将返回长度在$maxLength$minLength之间的随机字符串。

注意::功能random_bytes自PHP 7开始生效。

如果您需要特定的长度,则$maxLength$minLength 必须相同

function getRandomString($maxLength = 20, $minLength = 10)
{
    $minLength = $maxLength < $minLength ? $maxLength : $minLength;
    $halfMin = ceil($minLength / 2);
    $halfMax = ceil($maxLength / 2);
    $bytes = random_bytes(rand($halfMin, $halfMax));
    $randomString = bin2hex($bytes);
    $randomString = strlen($randomString) > $maxLength ? substr($randomString, 0, -1) : $randomString;
    return $randomString;
}

答案 53 :(得分:-1)

我总是喜欢使用base64来生成随机密码或其他随机(可打印)字符串。 base64的使用确保可以使用大量可打印字符。

在shell上,我通常做这样的事情:

base64 < /dev/urandom |head -c10

类似的东西也可以在PHP中完成。但是,open_basedir限制可能禁止直接从/ dev / urandom读取。所以这就是我所得到的:

base64_encode(
    join(
        '',
        array_map(
            function($x){ return chr(mt_rand(1,255));},
            range(1,15)
        )
    )
);

要获得真正随机的字符串,我们还需要随机输入。这就是join/array_map的作用。使用像uniqid这样的东西是不够的,因为它总是有一个类似的前缀,因为它基本上是一个美化的时间戳。

如果您安装了openssl扩展程序,您当然可以使用openssl_random_pseudo_bytes()代替,这样会更好。

答案 54 :(得分:-1)

$t = array_merge(range('0', '9'), range('a', 'z'), range('A', 'Z'));
echo join('', array_map(function() use($t) { return $t[array_rand($t)]; }, range(1, 15)));

或单行

echo join('', array_map(function() { return substr('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', rand(0, 61), 1); }, range(1, 15)));

答案 55 :(得分:-1)

你喜欢单行吗?

试试这个,

        if (name == 'name') {

        icon: image2

        }

答案 56 :(得分:-1)

试试这个:

function generate_name ($length = LENGTH_IMG_PATH) {
    $image_name = "";
    $possible = "0123456789abcdefghijklmnopqrstuvwxyz";

    $i = 0;

    while ($i < $length) {

        $char = substr($possible, mt_rand(0, strlen($possible)-1), 1);

        if (!strstr($image_name, $char)) {
            $image_name .= $char;
            $i++;               
        }              
    }            
    return $image_name;
}     

答案 57 :(得分:-1)

我说最好的几个答案并将它们放在一起 - str_suffle和范围对我来说是新的:

echo generateRandomString(25); // Example of calling it

function generateRandomString($length = 10) {
    return substr(str_shuffle(implode(array_merge(range(0,9), range('A', 'Z'), range('a', 'z')))), 0, $length);
}

答案 58 :(得分:-1)

如果您在用户可能看到它或使用它的地方使用此随机字符串(例如作为密码生成器,您可能希望限制用于排除元音的字符集。这样您就不会意外地生成坏话,冒犯别人。不要笑它发生。

答案 59 :(得分:-2)

Previous answers generate passwords that are insecure or difficult to type.

This one is secure and provides a password that users are more likely to actually use, instead of being discarded for something weak.

// NOTE: On PHP 5.x you will need to install https://github.com/paragonie/random_compat

/**
 * Generate a password that can easily be typed by users.
 *
 * By default, this will sacrifice strength by skipping characters that can cause
 * confusion. Set $allowAmbiguous to allow these characters.
 */
static public function generatePassword($length=12, $mixedCase=true, $numericCount=2, $symbolCount=1, $allowAmbiguous=false, $allowRepeatingCharacters=false)
{
  // sanity check to prevent endless loop
  if ($numericCount + $symbolCount > $length) {
    throw new \Exception('generatePassword(): $numericCount + $symbolCount are too high');
  }

  // generate a basic password with just alphabetic characters
  $chars  = 'qwertyupasdfghjkzxcvbnm';
  if ($mixedCase) {
    $chars .= 'QWERTYUPASDFGHJKZXCVBNML';
  }
  if ($allowAmbiguous) {
    $chars .= 'iol';
    if ($mixedCase) {
      $chars .= 'IO';
    }
  }

  $password = '';
  foreach (range(1, $length) as $index) {
    $char = $chars[random_int(0, strlen($chars) - 1)];

    if (!$allowRepeatingCharacters) {
      while ($char == substr($password, -1)) {
        $char = $chars[random_int(0, strlen($chars) - 1)];
      }
    }

    $password .= $char;
  }


  // add numeric characters
  $takenSubstitutionIndexes = [];

  if ($numericCount > 0) {
    $chars = '23456789';
    if ($allowAmbiguous) {
      $chars .= '10';
    }

    foreach (range(1, $numericCount) as $_) {
      $index = random_int(0, strlen($password) - 1);
      while (in_array($index, $takenSubstitutionIndexes)) {
        $index = random_int(0, strlen($password) - 1);
      }

      $char = $chars[random_int(0, strlen($chars) - 1)];
      if (!$allowRepeatingCharacters) {
        while (substr($password, $index - 1, 1) == $char || substr($password, $index + 1, 1) == $char) {
          $char = $chars[random_int(0, strlen($chars) - 1)];
        }
      }

      $password[$index] = $char;
      $takenSubstitutionIndexes[] = $index;
    }
  }

  // add symbols
  $chars = '!@#$%&*=+?';
  if ($allowAmbiguous) {
    $chars .= '^~-_()[{]};:|\\/,.\'"`<>';
  }

  if ($symbolCount > 0) {
    foreach (range(1, $symbolCount) as $_) {
      $index = random_int(0, strlen($password) - 1);
      while (in_array($index, $takenSubstitutionIndexes)) {
        $index = random_int(0, strlen($password) - 1);
      }

      $char = $chars[random_int(0, strlen($chars) - 1)];
      if (!$allowRepeatingCharacters) {
        while (substr($password, $index - 1, 1) == $char || substr($password, $index + 1, 1) == $char) {
          $char = $chars[random_int(0, strlen($chars) - 1)];
        }
      }

      $password[$index] = $char;
      $takenSubstitutionIndexes[] = $index;
    }
  }

  return $password;
}

答案 60 :(得分:-2)

如果你需要大量没有重复的随机字符串,这里是一个带有小修改的递归代码:

function generateRandomString($length = 10)
{
    global $generatedStrings;
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $randomString = '';
    for ($i = 0; $i < $length; $i++) {
        $randomString .= $characters[rand(0, strlen($characters) - 1)];
    }
    if (isset($generatedStrings[$randomString])) {
        $randomString = generateRandomString($length);
    }
    $generatedStrings[$randomString] = $randomString;
    return $randomString;
}

$generatedStrings = array();

foreach(range(1, 100000) as $num) {
    echo "\n".$num."\t : ".generateRandomString();
}

答案 61 :(得分:-3)

$pass = "";
for ($i=0;$i<12;++$i)
  $pass.= ($r=mt_rand(0,35))<26?chr(ord('a')+$r):chr(ord('0')+$r-26);