我正在寻找创建一个可重用的函数,该函数将生成一个随机密钥,该随机密钥具有选定长度(可从2到1000+)的可打印ACSII字符。我认为可打印的ASCII字符应为33-126。它们的密钥不需要完全唯一,只要在完全相同的毫秒内生成就可以唯一(因此uniqid()不起作用)。
uniqid()
我正在考虑将结合使用,chr()并且mt_rand()可能会起作用。
chr()
mt_rand()
这是要走的路,还是其他最佳方法?
编辑: uniqid()也将不起作用,因为它没有长度参数,这就是PHP给您的。
我的想法 :这是我想出的:
function GenerateKey($length = 16) { $key = ''; for($i = 0; $i < $length; $i ++) { $key .= chr(mt_rand(33, 126)); } return $key; }
这有什么问题吗?
另一个编辑: 大多数其他问题与密码生成有关。我希望有一个更广泛的角色,我不关心1VS l。我希望最大数量的可能键。
1
l
注意:生成的密钥不一定必须是加密安全的。
更新(12/2015):对于PHP7.0,您应该使用random_int()而不是,mt_rand因为它提供了“加密安全值”
random_int()
mt_rand
就个人而言,我喜欢使用,sha1(microtime(true).mt_rand(10000,90000))但是您正在寻找更多的可定制方法,因此请尝试使用此功能
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: 我决定使用PHP 5和eAccelerator在我的Debian机器上做一个不错的小测试(请使用长代码):
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(我尚未测试过。)