PHP随机字符串生成器

我想在PHP中创建一个随机化的字符串,并且我完全没有输出:

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

我究竟做错了什么?


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

  • 当你回应它时, $randstring不在范围之内。
  • 字符不会在循环中连接在一起。
  • 这是一个带有更正的代码片段:

    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();
    

    请注意,这会产生可预测的随机字符串。 如果您想创建安全令牌,请参阅此答案。


    注意: str_shuffle()内部使用rand() ,这不适用于加密目的(例如,生成随机密码)。 你需要一个安全的随机数发生器。 它也不允许字符重复。

    还有一种方法。

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

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

    而已。 :)


    这个问题有很多答案,但没有一个能够利用密码安全的伪随机数生成器(CSPRNG)。

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

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

    在PHP中安全地生成随机整数不是一项简单的任务。 在部署生产中的自制算法之前,您应该始终与您的常驻StackExchange加密专家进行核对。

    使用安全的整数生成器,生成一个随机字符串与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)

    链接地址: http://www.djcxy.com/p/20591.html

    上一篇: PHP random string generator

    下一篇: How to generate a random string in Ruby