在PHP中生成30个字符的随机字符串

3

我正在尝试创建一个随机字符串,它应该恰好包含30个字符。但有时它也会创建28个字符。如何解决这个问题?

我的代码如下:

function random_string(){
    $character_set_array = array( );
    $character_set_array[ ] = array( 'count' => 15, 'characters' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ' );
    $character_set_array[ ] = array( 'count' => 6, 'characters' => '0123456789' );
    $character_set_array[ ] = array( 'count' => 9, 'characters' => '!@#$%^&+_|~-=\{}[]:?/' );
    $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 );
}

请帮助我。


1
你是如何使用这个字符串并测试它的长度的?我怀疑问题出在后面的使用上(例如由于特殊字符在BD中的引入)。 - Denys Séguret
我复制整个生成的字符串,利用strlen()函数获取代码长度。 - Bappa
是的!当我排除特殊字符时,它就正常了。那么是否有其他方法可以包含特殊字符?如果有,请帮忙。 - Bappa
这是仅针对 "" 吗?如果是的话,那我可以避免它。 - Bappa
我认为是这样的。即使您成功地将其集成,我也不敢在像PHP这样的语言中随意使用“\”(但我不熟悉PHP内部)。 - Denys Séguret
4个回答

1

我忍不住重写了这个函数,否则我就睡不着觉了...

<?php

function random_string(){

        $charset = array();

        $charset[]='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ';
        $charset[]='0123456789';
        $charset[]='!@#$%^&+_|~-=\{}[]:?/';

        $res='';

        for($i=0;$i<30;$i++){
                $j=$charset[array_rand($charset)];
                $res.=$j[mt_rand(0,strlen($j)-1)];
        }

        return($res);
}

// Let us do a long test that the returned random string is always 30 characters long
for($a=0;$a<1000000;$a++){
        $z=random_string();
        if(strlen($z)!=30){print("ERR!!! --> $z");exit;}
}

// If we make it here then all is good... probably.
print("OK!\n");

?>

1
我执行了这个函数10,000次,从未得到一个少于30个字符的字符串。

但是我也在我的模块中使用相同的代码。但是遇到了这种问题。 - Bappa

0

试试这个:

$temp_array = array( );
$temp_array[] = '\';
$temp_array[] = 'A';
echo implode( '', $temp_array );
echo '<br>length:'.strlen( implode( '', $temp_array ));

这会显示

A
length:1

尝试从您的列表中删除\

0

试试这个:

function random_string(){
    $character_set_array = array( );
    $character_set_array[ ] = array( 'count' => 15, 'characters' => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ' );
    $character_set_array[ ] = array( 'count' => 6, 'characters' => '0123456789' );
    $character_set_array[ ] = array( 'count' => 9, 'characters' => '!@#$%^&+_|~-=\{}[]:?/' );
    $temp_array = array( );

    foreach ( $character_set_array as $character_set )
    {
      for ( $i = 0; $i < $character_set[ 'count' ]; $i++ )
      {
        $temp_array[ ] = substr($character_set[ 'characters' ], 0, rand(0, count( $character_set[ 'characters' ] ) - 1 ));
      }
    }

    shuffle( $temp_array );
    return implode( '', $temp_array );
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接