我正在寻找生成随机/唯一字符串的最短方法,为此我使用了以下两个:
$cClass = sha1(time());
Run Code Online (Sandbox Code Playgroud)
要么
$cClass = md5(time());
Run Code Online (Sandbox Code Playgroud)
但是,我需要字符串以字母字符开头,我正在查看base64编码,但最后会添加==,然后我需要摆脱它.
用一行代码实现这一目标的最佳方法是什么?
更新:
PRNDL提出了一个很好的建议,我最终使用它,但有点修改
echo substr(str_shuffle(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ),0, 1) . substr(str_shuffle(aBcEeFgHiJkLmNoPqRstUvWxYz0123456789),0, 31)
Run Code Online (Sandbox Code Playgroud)
将产生32个字符来模仿md5哈希,但它总是会产生第一个字母字母,就像这样;

然而,Uours真的改进了他的答案;
substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1).substr(md5(time()),1);
Run Code Online (Sandbox Code Playgroud)
更短,更甜
Anonymous2011的另一个建议非常棒,但由于某种原因,第一个角色总是要么M,N,Y,Z所以不适合我的目的但是会选择答案,顺便说一下有谁知道为什么它会总是产生那些特定的字母?
这是我修改版本的预览
echo rtrim(base64_encode(md5(microtime())),"=");
Run Code Online (Sandbox Code Playgroud)

Uou*_*urs 29
不是改变字母串,而是获得单个随机字符更快.
从字符串中获取一个随机字符,然后将其附加md5( time( ) )到它.在追加之前md5( time( ) )从中删除一个字符,以便将结果字符串长度保持为32个字符:
substr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", mt_rand(0, 51), 1).substr(md5(time()), 1);
Run Code Online (Sandbox Code Playgroud)
小写版本:
substr("abcdefghijklmnopqrstuvwxyz", mt_rand(0, 25), 1).substr(md5(time()), 1);
Run Code Online (Sandbox Code Playgroud)
或者甚至更短,更小一点的小写版本:
chr(mt_rand(97, 122)).substr(md5(time()), 1);
/* or */
chr(mt_rand(ord('a'), ord('z'))).substr(md5(time()), 1);
Run Code Online (Sandbox Code Playgroud)
任何试图在一秒内生成许多随机字符串的人的注释:
由于 time( ) 返回时间以秒为单位, 在给定的第二时间内md5( time( ) ) 将是相同的,因为如果在一秒钟内生成了许多随机字符串,则可能是可能最终会有一些重复.
我已经使用以下代码进行了测试 这测试小写版本:
$num_of_tests = 100000;
$correct = $incorrect = 0;
for( $i = 0; $i < $num_of_tests; $i++ )
{
$rand_str = substr( "abcdefghijklmnopqrstuvwxyz" ,mt_rand( 0 ,25 ) ,1 ) .substr( md5( time( ) ) ,1 );
$first_char_of_rand_str = substr( $rand_str ,0 ,1 );
if( ord( $first_char_of_rand_str ) < ord( 'a' ) or ord( $first_char_of_rand_str ) > ord( 'z' ) )
{
$incorrect++;
echo $rand_str ,'<br>';
}
else
{
$correct++;
}
}
echo 'Correct: ' ,$correct ,' . Incorrect: ' ,$incorrect ,' . Total: ' ,( $correct + $incorrect );
Run Code Online (Sandbox Code Playgroud)
23k*_*ens 27
我找到了这样的东西:
$length = 10;
$randomString = substr(str_shuffle(md5(time())),0,$length);
echo $randomString;
Run Code Online (Sandbox Code Playgroud)
如果您需要以字母开头,您可以这样做.这很麻烦......但它是一条线.
$randomString = substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1) . substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
echo $randomString;
Run Code Online (Sandbox Code Playgroud)
我认为这个问题需要更好的答案.像代码高尔夫!这也使用更好的随机字节发生器.
preg_replace("/[\/=+]/", "", base64_encode(openssl_random_pseudo_bytes(8)));
Run Code Online (Sandbox Code Playgroud)
显然,增加更长密码的字节数.