Update (12/2015): For PHP 7.0, you should use random_int()
instead of mt_rand
as it provides "cryptographically secure values"
Personally, I like to use sha1(microtime(true).mt_rand(10000,90000))
but you are looking for more of a customizable approach, so try this function (which is a modification to your request of this answer):
function rand_char($length) {
$random = '';
for ($i = 0; $i < $length; $i++) {
$random .= chr(mt_rand(33, 126));
}
return $random;
}
Still, this will probably be significantly slower than uniqid(), md5(), or sha1().
Edit: Looks like you got to it first, sorry. :D
Edit 2: I decided to do a nice little test on my Debian machine with PHP 5 and eAccelerator (excuse the long code):
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:".(microtime(true) - $a)."
";
$a = microtime(true);
for ($x = 0; $x < 1000; $x++)
$temp = rand_sha1(1000);
echo "SHA-1:".(microtime(true) - $a)."
";
$a = microtime(true);
for ($x = 0; $x < 1000; $x++)
$temp = rand_md5(1000);
echo "MD5:".(microtime(true) - $a)."
";
Results:
Rand: 2.09621596336
SHA-1: 0.611464977264
MD5: 0.618473052979
So my suggestion, if you want speed (but not full charset), is to stick to MD5, SHA-1, or Uniqid (which I didn't test.. yet)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…