更新(12/2015):对于PHP 7.0,您应该使用{{link1:random_int()
}}而不是mt_rand
,因为它提供了“密码学安全值”
个人而言,我喜欢使用sha1(microtime(true).mt_rand(10000,90000))
,但您正在寻找更具可定制性的方法,所以请尝试这个函数(这是对您的请求的修改[此答案][1]):
function rand_char($length) {
$random = '';
for ($i = 0; $i < $length; $i++) {
$random .= chr(mt_rand(33, 126));
}
return $random;
}
这可能比uniqid()、md5()或sha1()慢得多。编辑:看起来你先到了,抱歉。编辑2:我决定在我的Debian机器上进行一个小测试,使用PHP 5和eAccelerator(请原谅这段长代码)。
function rand_char($length) {
$random = '';
for ($i = 0; $i < $length; $i++) {
$random .= chr(mt_rand(33, 126));
}
return $random;
}
function rand_sha1($length) {
$max = ceil($length / 40);
$random = '';
for ($i = 0; $i < $max; $i ++) {
$random .= sha1(microtime(true).mt_rand(10000,90000));
}
return substr($random, 0, $length);
}
function rand_md5($length) {
$max = ceil($length / 32);
$random = '';
for ($i = 0; $i < $max; $i ++) {
$random .= md5(microtime(true).mt_rand(10000,90000));
}
return substr($random, 0, $length);
}
$a = microtime(true);
for ($x = 0; $x < 1000; $x++)
$temp = rand_char(1000);
echo "Rand:\t".(microtime(true) - $a)."\n";
$a = microtime(true);
for ($x = 0; $x < 1000; $x++)
$temp = rand_sha1(1000);
echo "SHA-1:\t".(microtime(true) - $a)."\n";
$a = microtime(true);
for ($x = 0; $x < 1000; $x++)
$temp = rand_md5(1000);
echo "MD5:\t".(microtime(true) - $a)."\n";
结果:
Rand: 2.09621596336
SHA-1: 0.611464977264
MD5: 0.618473052979
所以我的建议是,如果你想要速度(但不需要完整的字符集),那就使用MD5、SHA-1或Uniqid(我还没有测试过)。
[1]:
在php中生成短唯一标识符
Random::asciiPrintableString($length)
正好满足你的需求。如果你只想要字母和数字,那么请使用Random::alphanumericString($length)
。 - caw