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

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

    RandomString();
    echo $randstring;

我做错了什么?


当前回答

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

其他回答

如果您在用户可能看到或使用它的地方使用这个随机字符串(例如作为密码生成器),您可能希望限制用于排除元音的字符集。这样你就不会不小心说脏话,也不会冒犯别人。别笑,这是常有的事。

Laravel解决方案: 如果你正在使用Laravel框架,你可以像这样使用它的StringHelper。

使用“照亮\支持\斯特”;

Str::random($strlentgh = 16)

试试这个:

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

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

在shell上,我通常这样做:

base64 < /dev/urandom |head -c10

在PHP中也可以做类似的事情。然而,直接从/dev/urandom读取可能会被open_basedir限制所禁止。这就是我得出的结论:

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(),这样会更好。

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

$string = base64_encode(openssl_random_pseudo_bytes(30));

由于是base64,它们可以包含=或-以及所请求的字符。您可以生成一个更长的字符串,然后过滤和修剪它以删除它们。

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