Обновление (12/2015): для PHP 7.0 вы должны использовать random_int()
вместо mt_rand
, поскольку он предоставляет «криптографически безопасные значения»
Лично мне нравится использовать sha1(microtime(true).mt_rand(10000,90000))
, но вы ищете более настраиваемый подход, поэтому попробуйте эту функцию (которая является модификацией вашего запроса этот ответ ):
function rand_char($length) {
$random = '';
for ($i = 0; $i < $length; $i++) {
$random .= chr(mt_rand(33, 126));
}
return $random;
}
Тем не менее, это, вероятно, будет значительно медленнее, чем uniqid (), md5 () или sha1 ().
Редактировать: Похоже, вы добрались до него первым, извините. : D
Редактировать 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 (который я не тестировал ... пока)