我正在尝试在PHP中创建一个随机字符串,我绝对没有输出:
<?php
function RandomString()
{
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randstring = '';
for ($i = 0; $i < 10; $i++) {
$randstring = $characters[rand(0, strlen($characters))];
}
return $randstring;
}
RandomString();
echo $randstring;
我做错了什么?
答案 0 :(得分:1277)
具体回答这个问题,有两个问题:
$randstring
不在范围内。以下是带有更正的代码段:
function generateRandomString($length = 10) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
使用以下调用输出随机字符串:
// Echo the random string.
// Optionally, you can give it a desired string length.
echo generateRandomString();
请注意,这会产生可预测的随机字符串。如果您想创建安全令牌,请see this answer。
答案 1 :(得分:347)
注意:
str_shuffle()
内部使用rand()
,这不适合加密目的(例如生成随机密码)。你想要一个secure random number generator。它也不允许重复字符。
更新 (现在生成任意长度的字符串):
function generateRandomString($length = 10) {
return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);
}
echo generateRandomString(); // OR: generateRandomString(24)
就是这样。 :)
答案 2 :(得分:287)
这个问题有很多答案,但没有一个利用Cryptographically Secure Pseudo-Random Number Generator(CSPRNG)。
简单,安全和正确的答案是使用RandomLib并且不要重新发明轮子。
对于那些坚持发明自己的解决方案的人,PHP 7.0.0将为此目的提供random_int()
;如果你仍然使用PHP 5.x,我们写了一个PHP 5 polyfill for random_int()
,这样你甚至可以在升级到PHP 7之前使用新的API。
Safely generating random integers in PHP不是一项微不足道的任务。在生产中部署本地算法之前,应始终使用your resident StackExchange cryptography experts进行检查。
使用安全整数生成器,使用CSPRNG生成随机字符串就是在公园散步。
/**
* Generate a random string, using a cryptographically secure
* pseudorandom number generator (random_int)
*
* For PHP 7, random_int is a PHP core function
* For PHP 5.x, depends on https://github.com/paragonie/random_compat
*
* @param int $length How many characters do we want?
* @param string $keyspace A string of all possible characters
* to select from
* @return string
*/
function random_str($length, $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
{
$pieces = [];
$max = mb_strlen($keyspace, '8bit') - 1;
for ($i = 0; $i < $length; ++$i) {
$pieces []= $keyspace[random_int(0, $max)];
}
return implode('', $pieces);
}
<强>用法强>:
$a = random_str(32);
$b = random_str(8, 'abcdefghijklmnopqrstuvwxyz');
演示:https://3v4l.org/b4PST(忽略PHP 5失败;需要random_compat)
答案 3 :(得分:128)
创建一个20字符长的hexdec字符串:
$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars
在PHP 7中(random_bytes()):
$string = base64_encode(random_bytes(10)); // ~14 chars, includes /=+
// or
$string = substr(str_replace(['+', '/', '='], '', base64_encode(random_bytes(32))), 0, 32); // 32 chars, without /=+
// or
$string = bin2hex(random_bytes(10)); // 20 chars, only 0-9a-f
答案 4 :(得分:82)
@tasmaniski:你的回答对我有用。我有同样的问题,我建议那些一直在寻找相同答案的人。这是来自@tasmaniski:
<?php
$random = substr(md5(mt_rand()), 0, 7);
echo $random;
?>
答案 5 :(得分:43)
根据您的应用程序(我想生成密码),您可以使用
$string = base64_encode(openssl_random_pseudo_bytes(30));
作为base64,它们可能包含=
或-
以及请求的字符。你可以生成一个更长的字符串,然后过滤并修剪它以删除它们。
openssl_random_pseudo_bytes
似乎是在php中生成适当随机数的推荐方法。为什么rand
不使用/dev/random
我不知道。
答案 6 :(得分:25)
我知道游戏可能有点晚了,但是这里有一个简单的单行程序,它可以生成一个真正的随机字符串,而不需要任何脚本级循环或使用openssl库。
echo substr(str_shuffle(str_repeat('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', mt_rand(1,10))),1,10);
将其分解以使参数清晰
// Character List to Pick from
$chrList = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
// Minimum/Maximum times to repeat character List to seed from
$chrRepeatMin = 1; // Minimum times to repeat the seed string
$chrRepeatMax = 10; // Maximum times to repeat the seed string
// Length of Random String returned
$chrRandomLength = 10;
// The ONE LINE random command with the above variables.
echo substr(str_shuffle(str_repeat($chrList, mt_rand($chrRepeatMin,$chrRepeatMax))),1,$chrRandomLength);
此方法通过随机重复字符列表,然后混合组合字符串,并返回指定的字符数来工作。
您可以通过随机化返回的字符串的长度,将$chrRandomLength
替换为mt_rand(8, 15)
(对于8到15个字符之间的随机字符串)来进一步随机化。
答案 7 :(得分:24)
function generateRandomString($length = 15)
{
return substr(sha1(rand()), 0, $length);
}
多田!
答案 8 :(得分:23)
实现此功能的更好方法是:
function RandomString($length) {
$keys = array_merge(range(0,9), range('a', 'z'));
$key = "";
for($i=0; $i < $length; $i++) {
$key .= $keys[mt_rand(0, count($keys) - 1)];
}
return $key;
}
echo RandomString(20);
根据php7中的this和this, mt_rand
更随机。 rand
函数是mt_rand
的别名。
答案 9 :(得分:21)
PHP 7 + 使用random_bytes函数生成加密安全的随机字节。
$bytes = random_bytes(16);
echo bin2hex($bytes);
可能的输出
da821217e61e33ed4b2dd96f8439056c
PHP 5.3 + 使用openssl_random_pseudo_bytes函数生成伪随机字节。
$bytes = openssl_random_pseudo_bytes(16);
echo bin2hex($bytes);
可能的输出
e2d1254506fbb6cd842cd640333214ad
最佳用例可能是
function getRandomBytes($length = 16)
{
if (function_exists('random_bytes')) {
$bytes = random_bytes($length / 2);
} else {
$bytes = openssl_random_pseudo_bytes($length / 2);
}
return bin2hex($bytes);
}
echo getRandomBytes();
可能的输出
ba8cc342bdf91143
答案 10 :(得分:19)
$randstring
与您调用它的作用域不同。您必须将返回值分配给变量。
$randstring = RandomString();
echo $randstring;
或直接回显返回值:
echo RandomString();
另外,在你的功能中你有一点错误。在for循环中,您需要使用.=
,以便每个字符都附加到字符串中。通过使用=
,您将使用每个新字符覆盖它而不是附加。
$randstring .= $characters[rand(0, strlen($characters))];
答案 11 :(得分:14)
首先,您定义要使用的字母:
$alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
$special = '~!@#$%^&*(){}[],./?';
$alphabet = $alphanum . $special;
然后,使用openssl_random_pseudo_bytes()
生成适当的随机数据:
$len = 12; // length of password
$random = openssl_random_pseudo_bytes($len);
最后,您使用此随机数据来创建密码。由于$random
中的每个字符都可以chr(0)
到chr(255)
,因此代码会使用$alphabet_length
除以序数值后的余数,以确保只挑选字母表中的字符(注意这样做会影响随机性):
$alphabet_length = strlen($alphabet);
$password = '';
for ($i = 0; $i < $len; ++$i) {
$password .= $alphabet[ord($random[$i]) % $alphabet_length];
}
或者,通常更好的方法是使用RandomLib和SecurityLib:
use SecurityLib\Strength;
$factory = new RandomLib\Factory;
$generator = $factory->getGenerator(new Strength(Strength::MEDIUM));
$password = $generator->generateString(12, $alphabet);
答案 12 :(得分:10)
我测试了那里最流行的功能的性能,在我的盒子上生成1'000'000个32个符号的字符串所需的时间是:
2.5 $s = substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,32);
1.9 $s = base64_encode(openssl_random_pseudo_bytes(24));
1.68 $s = bin2hex(openssl_random_pseudo_bytes(16));
0.63 $s = base64_encode(random_bytes(24));
0.62 $s = bin2hex(random_bytes(16));
0.37 $s = substr(md5(rand()), 0, 32);
0.37 $s = substr(md5(mt_rand()), 0, 32);
请注意它确实存在多长时间并不重要但速度较慢哪一个更快,因此您可以根据您的要求选择加密准备等。
为了准确起见,如果你需要的字符串短于32个符号,则添加MD5周围的substr()。
为了回答:字符串没有连接但是被覆盖,并且没有存储函数的结果。
答案 13 :(得分:9)
以下是生成随机字符串的最简短方法
<?php
echo $my_rand_strng = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), -15);
echo substr(md5(rand()), 0, 7);
echo str_shuffle(MD5(microtime()));
?>
答案 14 :(得分:7)
这是取自adminer sources:
/** Get a random string
* @return string 32 hexadecimal characters
*/
function rand_string() {
return md5(uniqid(mt_rand(), true));
}
Adminer,用PHP编写的数据库管理工具。
答案 15 :(得分:7)
function rndStr($len = 64) {
$randomData = file_get_contents('/dev/urandom', false, null, 0, $len) . uniqid(mt_rand(), true);
$str = substr(str_replace(array('/','=','+'),'', base64_encode($randomData)),0,$len);
return $str;
}
答案 16 :(得分:6)
一种非常快速的方法是做一些事情:
substr(md5(rand()),0,10);
这将生成一个长度为10个字符的随机字符串。当然,有些人可能会说它在计算方面有点沉重,但现在处理器已经过优化,可以非常快速地运行md5或sha256算法。当然,如果rand()
函数返回相同的值,结果将是相同的,具有1/32767的相同概率。如果安全性是问题,那么只需将rand()
更改为mt_rand()
答案 17 :(得分:6)
Laravel 5框架中的Helper功能
/**
* Generate a "random" alpha-numeric string.
*
* Should not be considered sufficient for cryptography, etc.
*
* @param int $length
* @return string
*/
function str_random($length = 16)
{
$pool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
return substr(str_shuffle(str_repeat($pool, $length)), 0, $length);
}
答案 18 :(得分:5)
/**
* @param int $length
* @param string $abc
* @return string
*/
function generateRandomString($length = 10, $abc = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
{
return substr(str_shuffle($abc), 0, $length);
}
来自http://www.xeweb.net/2011/02/11/generate-a-random-string-a-z-0-9-in-php/
的来源答案 19 :(得分:4)
该函数的编辑版本工作正常,我找到了一个问题:你使用了错误的字符来包含$字符,因此'字符有时是生成的随机字符串的一部分。
要解决此问题,请更改:
$characters = ’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;
为:
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
这种方式只使用包含的字符,'字符永远不会是生成的随机字符串的一部分。
答案 20 :(得分:4)
自php7起,就存在random_bytes函数。 https://www.php.net/manual/ru/function.random-bytes.php 这样您就可以生成这样的随机字符串
<?php
$bytes = random_bytes(5);
var_dump(bin2hex($bytes));
?>
答案 21 :(得分:4)
一行。
快速的巨大字符串,具有一定的独特性。
function random_string($length){
return substr(str_repeat(md5(rand()), ceil($length/32)), 0, $length);
}
答案 22 :(得分:4)
另一个单行,生成随机字符串,包含10个字母和数字字符。它将创建一个带有range
的数组(调整第二个参数来设置大小),循环遍历此数组并分配一个随机的ascii-char(范围0-9或az),然后内爆数组以获取字符串
$str = implode('', array_map(function () { return chr(rand(0, 1) ? rand(48, 57) : rand(97, 122)); }, range(0, 9)));
注意:仅适用于PHP 5.3 +
答案 23 :(得分:3)
我喜欢使用openssl_random_pseudo_bytes的最后一条评论,但它不是我的解决方案,因为我仍然需要删除我不想要的字符,而且我无法获得设置长度的字符串。这是我的解决方案......
function rndStr($len = 20) {
$rnd='';
for($i=0;$i<$len;$i++) {
do {
$byte = openssl_random_pseudo_bytes(1);
$asc = chr(base_convert(substr(bin2hex($byte),0,2),16,10));
} while(!ctype_alnum($asc));
$rnd .= $asc;
}
return $rnd;
}
答案 24 :(得分:3)
function randomString($length = 5) {
return substr(str_shuffle(implode(array_merge(range('A','Z'), range('a','z'), range(0,9)))), 0, $length);
}
答案 25 :(得分:3)
这是另一种解决方案。
function genRandomString($length = 10)
{
if($length < 1)
$length = 1;
return substr(preg_replace("/[^A-Za-z0-9]/", '', base64_encode(openssl_random_pseudo_bytes($length * 2))), 0, $length);
}
PS。我在Ubuntu上使用PHP 7.2。
答案 26 :(得分:2)
有更好的替代方案,很多已经发布,所以我只给你回复你的东西
<?php
function RandomString()
{
global $randstring ;
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randstring = '';
for ($i = 0; $i < 10; $i++) {
$randstring .= $characters[rand(0, strlen($characters))];
}
return $randstring;
}
RandomString();
echo $randstring;
?>
您可能也感兴趣:
<?php
function RandomString()
{
global $randstring ;
$characters = str_split('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
array_filter ($characters,function($var)use($characters,&$randstring){
$randstring .= $characters[rand(0, count($characters)-1)];
});
return $randstring;
}
RandomString();echo $randstring.'<hr>';
//.. OR ..
$randstring='';echo(RandomString());
?>
或其他人:
<?php
function s($length){
for($i=0;($i<$length)and(($what=rand(1,3))and( (($what==1)and($t=rand(48,57) ))or (($what==2)and ($t=rand(65,90))) or (($what==3)and ($t=rand(97,122))) ) and (print chr($t)));$i++);
}
s(10);
?>
答案 27 :(得分:2)
仅使用 PHP本机函数进行参数化单线程,自 PHP 5.1.0
以来一直在工作str_shuffle(implode('', (array_intersect_key(($map = array_map('chr', array_merge(array_map('mt_rand', array_fill(0, $length = 25, 48), array_fill(0,$length,57)),array_map('mt_rand', array_fill(0, $length, 65), array_fill(0,$length,90)),array_map('mt_rand', array_fill(0, $length, 97), array_fill(0,$length,122))))), array_flip($keys = array_rand($map, $length))))))
答案 28 :(得分:2)
在PHP中生成随机字符串的另一种方法是:
function RandomString($length) {
$original_string = array_merge(range(0,9), range('a','z'), range('A', 'Z'));
$original_string = implode("", $original_string);
return substr(str_shuffle($original_string), 0, $length);
}
echo RandomString(6);
答案 29 :(得分:2)
这是我简单的单行解决方案,用于生成使用友好的随机密码,排除类似于“ 1”和“ l”,“ O”和“ 0”等类似的字符,这里是5个字符,但是您当然可以轻松更改它:
$user_password = substr(str_shuffle('abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789'),0,5);
答案 30 :(得分:2)
有一个简单的代码:
echo implode("",array_map(create_function('$s','return substr($s,mt_rand(0,strlen($s)),1);'),array_fill(0,16,"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")));
有简单的指南:
16
更改为其他值。答案 31 :(得分:2)
来自yii2框架
/**
* Generates a random string of specified length.
* The string generated matches [A-Za-z0-9_-]+ and is transparent to URL-encoding.
*
* @param int $length the length of the key in characters
* @return string the generated random key
*/
function generateRandomString($length = 10) {
$bytes = random_bytes($length);
return substr(strtr(base64_encode($bytes), '+/', '-_'), 0, $length);
}
答案 32 :(得分:1)
一种解决方案是
Adj Close
答案 33 :(得分:1)
通过这种方法,您可以在创建时选择字符长度。
<?php
$random_string="";
$character_count=12;
for($i=1; $i<=$character_count; $i++)
{
$random_string.=chr(rand(97,122));
}
echo $random_string;
?>
答案 34 :(得分:1)
这里是单线。您将至少获得一个小写字母,一个大写字母,一个数字和一个符号。使用应该random_int
进行密码学加密的方式。不过,我并不认为这是安全的。我不是安全专家。
要复制并粘贴:
for ($chars = array('0123456789','abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ','!@#$%^&*()_+-='),$randomString="",$i=0;$i<12;$i++)$randomString .= substr($chars[$i%4], random_int(0,strlen($chars[$i%4])), 1);
还有更多细分:
for (
$chars = array('0123456789','abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ','!@#$%^&*()_+-='),
$randomString="",
$i=0;
$i<12;$i++)
$randomString .=
substr($chars[$i%4],
random_int(0, strlen($chars[$i%4])), 1);
我在循环中使用$chars[$i%4]
选择要从中获取随机字符的集合。它可以保证数组中每个字符集都包含多个字符。
它肯定可以改进(随机分配每个字符集有多少个),但是对于我的目的来说已经足够了。
答案 35 :(得分:1)
我知道这是一个有多个答案的老问题,但我可以尝试发布解决方案...使用此函数生成自定义随机字母数字字符串...
<?php
function random_alphanumeric($length) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ12345689';
$my_string = '';
for ($i = 0; $i < $length; $i++) {
$pos = mt_rand(0, strlen($chars) -1);
$my_string .= substr($chars, $pos, 1);
}
return $my_string;
}
$test = random_alphanumeric(50); // 50 characters
echo $test;
?>
示例(测试):Y1FypdjVbFCFK6Gh9FDJpe6dciwJEfV6MQGpJqAfuijaYSZ86
如果您需要两个或多个唯一的字符串,则可以执行此操作...
$string_1 = random_alphanumeric(50);
$string_2 = random_alphanumeric(50);
while ($string_1 == $string_2) {
$string_1 = random_alphanumeric(50);
$string_2 = random_alphanumeric(50);
if ($string_1 != $string_2) {
break;
}
}
echo $string_1;
echo "<br>\n";
echo $string_2;
$ string_1:KkvUwia8rbDEV2aChWqm3AgeUZqyrRbUx2AxVhx5s4TSJ2VwA4
$ string_2:XraO85YfxBBCInafvwipSOJwLmk6JMWiuWOxYQDnXohcn2D8K6
我希望有帮助。
答案 36 :(得分:1)
具有上述讨论中某些功能的课程。
$options['numeric'] = true;
$options['uppercase'] = true;
$options['lowercase'] = true;
$new = new RandomString($options);
class RandomString
{
/**
* @var array
*/
private $default = ['numeric' => true, 'uppercase' => true, 'lowercase' => true];
/**
* @var array
*/
private $options;
/**
* array
*/
private $whitelist = ['numeric', 'uppercase', 'lowercase'];
/**
* RandomString constructor.
*
* @param array $options
*/
public function __construct(array $options = [])
{
$this->options = $this->default;
if(!empty($options))
{
$options = array_intersect_key($options, array_flip($this->whitelist));
if(empty($options))
{
$this->options = $this->default;
}else
{
$this->options = $options;
}
}
}
/**
* @return string
*/
private function returnCharacters(){
$options = $this->options;
$numbers = '0123456789';
$uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$lowercase = "abcdefghijklmnopqrstuvwxyz";
$characters = '';
if(isset($options['numeric']) && $options['numeric'] === true){
$characters .= $numbers;
}
if(isset($options['uppercase']) && $options['uppercase'] === true){
$characters .= $uppercase;
}
if(isset($options['lowercase']) && $options['lowercase'] === true){
$characters .= $lowercase;
}
return $characters;
}
/**
* @param $length
* @param $quantity
* @return string
*/
public function randomString($length, $quantity) {
$string = '';
$characters = $this->returnCharacters();
for ($j = 0; $j < $quantity; $j++) {
for($i = 0; $i < $length; $i++){
$string .= $characters[mt_rand(0, strlen($characters) - 1)];
}
$string .= "\n";
}
return $string;
}
/**
* @return array
*/
public function getOptions()
{
return $this->options;
}
/**
* @return mixed
*/
public function getWhitelist()
{
return $this->whitelist;
}
答案 37 :(得分:1)
最后我找到了一个获得随机和独特价值的解决方案 我的解决方案是
substr(md5(time()), 0, 12)
时间总是返回timstamp,它始终是唯一的。您可以将它与md5一起使用以使其更好。
答案 38 :(得分:1)
function generateRandomString($length = 10, $hasNumber = true, $hasLowercase = true, $hasUppercase = true): string
{
$string = '';
if ($hasNumber)
$string .= '0123456789';
if ($hasLowercase)
$string .= 'abcdefghijklmnopqrstuvwxyz';
if ($hasUppercase)
$string .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
return substr(str_shuffle(str_repeat($x = $string, ceil($length / strlen($x)))), 1, $length);
}
并使用:
echo generateRandomString(32);
答案 39 :(得分:1)
function getRandomString($length) {
$salt = array_merge(range('a', 'z'), range(0, 9));
$maxIndex = count($salt) - 1;
$result = '';
for ($i = 0; $i < $length; $i++) {
$index = mt_rand(0, $maxIndex);
$result .= $salt[$index];
}
return $result
}
答案 40 :(得分:1)
以下是我如何获取真正的唯一随机密钥:
$Length = 10;
$RandomString = substr(str_shuffle(md5(time())), 0, $Length);
echo $RandomString;
你可以使用time(),因为它是一个Unix时间戳,并且与上面提到的其他随机数相比总是唯一的。然后,您可以生成其中的md5sum,并从生成的MD5字符串中获取所需的长度。在这种情况下,我使用10个字符,如果我想让它更独特,我可以使用更长的字符串。
我希望这会有所帮助。
答案 41 :(得分:1)
你这样做是完全错误的,因为你依赖于数字而不是字符,我不确定你是否希望随机输出只是数字,如果是这样,为什么需要获得所有字母和所有数字并提取他们的长度?为什么不使用rand(0, 62)
?,即使您在声明函数之前忘记初始化变量$randstring
。
无论如何,PHP为此提供了非常方便的功能str_shuffle()
,这是一个适合您需要的示例。
<?php
function randomString() {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
return str_shuffle($characters);
}
echo randomString();
&#13;
答案 42 :(得分:1)
<?php
/**
* Creates a random string
*
* @param (int) $length
* Length in characters
* @param (array) $ranges
* (optional) Array of ranges to be used
*
* @return
* Random string
*/
function random_string($length, $ranges = array('0-9', 'a-z', 'A-Z')) {
foreach ($ranges as $r) $s .= implode(range(array_shift($r = explode('-', $r)), $r[1]));
while (strlen($s) < $length) $s .= $s;
return substr(str_shuffle($s), 0, $length);
}
// Examples:
$l = 100;
echo '<b>Default:</b> ' . random_string($l) . '<br />';
echo '<b>Lower Case only:</b> ' . random_string($l, array('a-z')) . '<br />';
echo '<b>HEX only:</b> ' . random_string($l, array('0-9', 'A-F')) . '<br />';
echo '<b>BIN only:</b> ' . random_string($l, array('0-1')) . '<br />';
/* End of file */
答案 43 :(得分:1)
来源:PHP Function that Generates Random Characters
这个PHP函数对我有用:
function cvf_ps_generate_random_code($length=10) {
$string = '';
// You can define your own characters here.
$characters = "23456789ABCDEFHJKLMNPRTVWXYZabcdefghijklmnopqrstuvwxyz";
for ($p = 0; $p < $length; $p++) {
$string .= $characters[mt_rand(0, strlen($characters)-1)];
}
return $string;
}
用法:
echo cvf_ps_generate_random_code(5);
答案 44 :(得分:1)
以下函数生成任何长度的伪字符串。
/**
* Returns random string of a given length.
*/
function get_random_string($length) {
$pull = [];
while (count($pull) < $length) {
$pull = array_merge($pull, range(0, 9), range('a', 'z'), range('A', 'Z'));
}
shuffle($pull);
return substr(implode($pull), 0, $length);
}
答案 45 :(得分:0)
你好,你可以试试这个
<?php
function random($len){
$char = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
// ----------------------------------------------
// number of possible combinations
// ----------------------------------------------
$pos = strlen($char);
$pos = pow($pos, $len);
echo $pos.'<br>';
// ----------------------------------------------
$total = strlen($char)-1;
$text = "";
for ($i=0; $i<$len; $i++){
$text = $text.$char[rand(0, $total)];
}
return $text;
}
$string = random(15);
echo $string;
?>
你也可以按时使用md5,但要小心
您需要使用microtime()
而不是time()
函数,因为如果多个线程在同一秒内运行,则需要为所有线程获取不同的字符串。
<?php
$string = md5( microtime() );
echo $string;
?>
答案 46 :(得分:0)
function strgen($len) {
$buf = '';
for ($i = 0; $i < $len; $i++) {
$j = mt_rand(0, 61);
if ($j >= 36) {
$j += 13;
} else if ($j >= 10) {
$j += 7;
}
$buf .= chr(48 + $j);
}
return $buf;
}
简单而优雅。
答案 47 :(得分:0)
您的代码有3处错误:
"_all": {
"enabled": "true"
}
替换为=
。.=
不会生成加密安全的伪随机数。请改用Rand
。参见下文:
random_int
答案 48 :(得分:0)
function randomName($length = 8) {
$values = array_merge(range(65, 90), range(97, 122), range(48, 57));
$max = count($values) - 1;
$str = chr(mt_rand(97, 122));
for ($i = 1; $i < $length; $i++) {
$str .= chr($values[mt_rand(0, $max)]);
}
return $str;
}
答案 49 :(得分:0)
function randomString() {
return md5(rand(100, 200));
}
答案 50 :(得分:0)
如果您正在使用PHP 7 +
public function generateRandom(){
$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars
// OR
$string = base64_encode(random_bytes(10)); // ~14 characters, includes /=+
// or
$string = substr(str_replace(['+', '/', '='], '', base64_encode(random_bytes(32))), 0, 32); // 32 characters, without /=+
// or
$string = bin2hex(random_bytes(10)); // 20 characters, only 0-9a-f
}
答案 51 :(得分:0)
尝试一下,它最多可以生成母版的长度。但它简单且适合于小字符串。
$master="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$master_array = str_split($master);
shuffle($master_array);
print_r(implode("",array_slice($master_array,0,10)));
答案 52 :(得分:0)
此代码将帮助:
此函数将返回长度在$maxLength
和$minLength
之间的随机字符串。
注意::功能random_bytes
自PHP 7开始生效。
如果您需要特定的长度,则$maxLength
和$minLength
必须相同。
function getRandomString($maxLength = 20, $minLength = 10)
{
$minLength = $maxLength < $minLength ? $maxLength : $minLength;
$halfMin = ceil($minLength / 2);
$halfMax = ceil($maxLength / 2);
$bytes = random_bytes(rand($halfMin, $halfMax));
$randomString = bin2hex($bytes);
$randomString = strlen($randomString) > $maxLength ? substr($randomString, 0, -1) : $randomString;
return $randomString;
}
答案 53 :(得分:-1)
我总是喜欢使用base64来生成随机密码或其他随机(可打印)字符串。 base64的使用确保可以使用大量可打印字符。
在shell上,我通常做这样的事情:
base64 < /dev/urandom |head -c10
类似的东西也可以在PHP中完成。但是,open_basedir限制可能禁止直接从/ dev / urandom读取。所以这就是我所得到的:
base64_encode(
join(
'',
array_map(
function($x){ return chr(mt_rand(1,255));},
range(1,15)
)
)
);
要获得真正随机的字符串,我们还需要随机输入。这就是join/array_map
的作用。使用像uniqid
这样的东西是不够的,因为它总是有一个类似的前缀,因为它基本上是一个美化的时间戳。
如果您安装了openssl扩展程序,您当然可以使用openssl_random_pseudo_bytes()
代替,这样会更好。
答案 54 :(得分:-1)
$t = array_merge(range('0', '9'), range('a', 'z'), range('A', 'Z'));
echo join('', array_map(function() use($t) { return $t[array_rand($t)]; }, range(1, 15)));
或单行
echo join('', array_map(function() { return substr('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', rand(0, 61), 1); }, range(1, 15)));
答案 55 :(得分:-1)
你喜欢单行吗?
试试这个,
if (name == 'name') {
icon: image2
}
答案 56 :(得分:-1)
试试这个:
function generate_name ($length = LENGTH_IMG_PATH) {
$image_name = "";
$possible = "0123456789abcdefghijklmnopqrstuvwxyz";
$i = 0;
while ($i < $length) {
$char = substr($possible, mt_rand(0, strlen($possible)-1), 1);
if (!strstr($image_name, $char)) {
$image_name .= $char;
$i++;
}
}
return $image_name;
}
答案 57 :(得分:-1)
我说最好的几个答案并将它们放在一起 - str_suffle和范围对我来说是新的:
echo generateRandomString(25); // Example of calling it
function generateRandomString($length = 10) {
return substr(str_shuffle(implode(array_merge(range(0,9), range('A', 'Z'), range('a', 'z')))), 0, $length);
}
答案 58 :(得分:-1)
如果您在用户可能看到它或使用它的地方使用此随机字符串(例如作为密码生成器,您可能希望限制用于排除元音的字符集。这样您就不会意外地生成坏话,冒犯别人。不要笑它发生。
答案 59 :(得分:-2)
Previous answers generate passwords that are insecure or difficult to type.
This one is secure and provides a password that users are more likely to actually use, instead of being discarded for something weak.
// NOTE: On PHP 5.x you will need to install https://github.com/paragonie/random_compat
/**
* Generate a password that can easily be typed by users.
*
* By default, this will sacrifice strength by skipping characters that can cause
* confusion. Set $allowAmbiguous to allow these characters.
*/
static public function generatePassword($length=12, $mixedCase=true, $numericCount=2, $symbolCount=1, $allowAmbiguous=false, $allowRepeatingCharacters=false)
{
// sanity check to prevent endless loop
if ($numericCount + $symbolCount > $length) {
throw new \Exception('generatePassword(): $numericCount + $symbolCount are too high');
}
// generate a basic password with just alphabetic characters
$chars = 'qwertyupasdfghjkzxcvbnm';
if ($mixedCase) {
$chars .= 'QWERTYUPASDFGHJKZXCVBNML';
}
if ($allowAmbiguous) {
$chars .= 'iol';
if ($mixedCase) {
$chars .= 'IO';
}
}
$password = '';
foreach (range(1, $length) as $index) {
$char = $chars[random_int(0, strlen($chars) - 1)];
if (!$allowRepeatingCharacters) {
while ($char == substr($password, -1)) {
$char = $chars[random_int(0, strlen($chars) - 1)];
}
}
$password .= $char;
}
// add numeric characters
$takenSubstitutionIndexes = [];
if ($numericCount > 0) {
$chars = '23456789';
if ($allowAmbiguous) {
$chars .= '10';
}
foreach (range(1, $numericCount) as $_) {
$index = random_int(0, strlen($password) - 1);
while (in_array($index, $takenSubstitutionIndexes)) {
$index = random_int(0, strlen($password) - 1);
}
$char = $chars[random_int(0, strlen($chars) - 1)];
if (!$allowRepeatingCharacters) {
while (substr($password, $index - 1, 1) == $char || substr($password, $index + 1, 1) == $char) {
$char = $chars[random_int(0, strlen($chars) - 1)];
}
}
$password[$index] = $char;
$takenSubstitutionIndexes[] = $index;
}
}
// add symbols
$chars = '!@#$%&*=+?';
if ($allowAmbiguous) {
$chars .= '^~-_()[{]};:|\\/,.\'"`<>';
}
if ($symbolCount > 0) {
foreach (range(1, $symbolCount) as $_) {
$index = random_int(0, strlen($password) - 1);
while (in_array($index, $takenSubstitutionIndexes)) {
$index = random_int(0, strlen($password) - 1);
}
$char = $chars[random_int(0, strlen($chars) - 1)];
if (!$allowRepeatingCharacters) {
while (substr($password, $index - 1, 1) == $char || substr($password, $index + 1, 1) == $char) {
$char = $chars[random_int(0, strlen($chars) - 1)];
}
}
$password[$index] = $char;
$takenSubstitutionIndexes[] = $index;
}
}
return $password;
}
答案 60 :(得分:-2)
如果你需要大量没有重复的随机字符串,这里是一个带有小修改的递归代码:
function generateRandomString($length = 10)
{
global $generatedStrings;
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, strlen($characters) - 1)];
}
if (isset($generatedStrings[$randomString])) {
$randomString = generateRandomString($length);
}
$generatedStrings[$randomString] = $randomString;
return $randomString;
}
$generatedStrings = array();
foreach(range(1, 100000) as $num) {
echo "\n".$num."\t : ".generateRandomString();
}
答案 61 :(得分:-3)
$pass = "";
for ($i=0;$i<12;++$i)
$pass.= ($r=mt_rand(0,35))<26?chr(ord('a')+$r):chr(ord('0')+$r-26);