博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP随机字符串生成器
阅读量:2290 次
发布时间:2019-05-09

本文共 10219 字,大约阅读时间需要 34 分钟。

我正在尝试在中创建一个随机字符串,并且我对此绝对没有输出:

我究竟做错了什么?


#1楼

该函数的编辑版本可以正常工作,但是我发现只有一个问题:您使用了错误的字符来包围$字符,因此'字符有时是所生成的随机字符串的一部分。

要解决此问题,请更改:

$characters = ’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;

至:

$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

这样,仅使用封闭的字符,而'字符将永远不会成为所生成的随机字符串的一部分。


#2楼

实现此功能的更好方法是:

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);

mt_rand根据是更随机和在PHP 7. rand函数是一个别名mt_rand


#3楼

在生成随机字符串的另一种方法是:

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);

#4楼

注意: str_shuffle()内部使用 ,它不适合用于加密目的(例如,生成随机密码)。 您需要一个 。 它还不允许字符重复。

另一种方式。

UPDATED (现在这会生成任意长度的字符串):

function generateRandomString($length = 10) {    return substr(str_shuffle(str_repeat($x='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($x)) )),1,$length);}echo  generateRandomString();  // OR: generateRandomString(24)

而已。 :)


#5楼

Default: ' . random_string($l) . '
'; echo 'Lower Case only: ' . random_string($l, array('a-z')) . '
'; echo 'HEX only: ' . random_string($l, array('0-9', 'A-F')) . '
'; echo 'BIN only: ' . random_string($l, array('0-1')) . '
';/* End of file */

#6楼

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;}

#7楼

function generateRandomString($length = 15){    return substr(sha1(rand()), 0, $length);}

多田!


#8楼

根据您的应用程序(我想生成密码),您可以使用

$string = base64_encode(openssl_random_pseudo_bytes(30));

作为base64,它们可能包含=-以及所请求的字符。 您可以生成一个更长的字符串,然后对其进行过滤和修剪以将其删除。

openssl_random_pseudo_bytes似乎是在php中生成适当随机数的推荐方法。 为什么rand不使用/dev/random我不知道。


#9楼

@tasmaniski:您的回答对我有用。 我遇到了同样的问题,对于那些一直在寻找相同答案的人,我建议这样做。 这里是@tasmaniski:

这是一个


#10楼

我喜欢最后一个使用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;}

#11楼

这是我要获取真正的唯一随机密钥的方法:

$Length = 10;$RandomString = substr(str_shuffle(md5(time())), 0, $Length);echo $RandomString;

您可以使用time(),因为它是Unix时间戳,并且与上述其他随机变量相比始终是唯一的。 然后,您可以生成该值的md5sum,并从生成的字符串中获取所需的所需长度。 在这种情况下,我使用10个字符,并且如果我想使其更独特,则可以使用更长的字符串。

我希望这有帮助。


#12楼

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}

#13楼

一种非常快速的方法是执行以下操作:

substr(md5(rand()),0,10);

这将生成一个长度为10个字符的随机字符串。 当然,有些人可能会说它在计算方面更加繁琐,但是如今,处理器已经过优化,可以非常快速地运行md5或sha256算法。 当然,如果rand()函数返回相同的值,则结果将相同,相同的机会为1/32767。 如果安全是问题所在,则只需将rand()更改为mt_rand()


#14楼

首先,定义要使用的字母:

$alphanum = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';$special  = '~!@#$%^&*(){}[],./?';$alphabet = $alphanum . $special;

然后,使用生成适当的随机数据:

$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];}

另外,通常更好的方法是使用和 :

use SecurityLib\Strength;$factory = new RandomLib\Factory;$generator = $factory->getGenerator(new Strength(Strength::MEDIUM));$password = $generator->generateString(12, $alphabet);

#15楼

这是一个简单的单行代码,它可以生成真正的随机字符串,而无需任何脚本级循环或使用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替换$chrRandomLength mt_rand(8, 15) $chrRandomLength mt_rand(8, 15) (对于介于8到15个字符之间的随机字符串)。


#16楼

另一个单行代码,它生成一个由10个字符组成的随机字符串,其中包含字母和数字。 它将创建一个具有range的数组(调整第二个参数以设置大小),在该数组上循环并分配一个随机的ASCII字符(范围为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及更高版本中有效


#17楼

这将创建一个20个字符长的十六进制字符串:

$string = bin2hex(openssl_random_pseudo_bytes(10)); // 20 chars

在PHP 7( )中:

$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

#18楼

Laravel 5框架的辅助函数

/** * 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);}

#19楼

一支班轮。

对于具有某些唯一性的大型字符串来说,这是快速的。

function random_string($length){    return substr(str_repeat(md5(rand()), ceil($length/32)), 0, $length);}

#20楼

这个问题有很多答案,但是都没有利用 (CSPRNG)。

一个简单,安全且正确的答案是使用而不是重新发明轮子。

对于那些坚持发明自己的解决方案的人,PHP 7.0.0会为此目的提供 ; 如果您仍在使用PHP 5.x,我们编写了因此即使您升级到PHP 7,也可以使用新的API。

不是一件容易的事。 在生产中部署本地算法之前,应始终与 。

有了一个安全的整数生成器,用CSPRNG生成一个随机字符串就是在公园散步。

创建一个安全的随机字符串

/** * Generate a random string, using a cryptographically secure  * pseudorandom number generator (random_int) * * This function uses type hints now (PHP 7+ only), but it was originally * written for PHP 5 as well. *  * 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(    int $length = 64,    string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'): string {    if ($length < 1) {        throw new \RangeException("Length must be a positive integer");    }    $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');$c = random_str();

演示 : ://3v4l.org/IMJGF(忽略PHP 5失败;它需要random_compat)


#21楼

这是从 :

/** Get a random string* @return string 32 hexadecimal characters*/function rand_string() {    return md5(uniqid(mt_rand(), true));}

,用PHP编写的数据库管理工具。


#22楼

有简单的代码:

echo implode("",array_map(create_function('$s','return substr($s,mt_rand(0,strlen($s)),1);'),array_fill(0,16,"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")));

有一个简单的指南:

  • 要更改字符串长度 ,请仅将16更改为另一个值。
  • 要从不同的字符中进行选择,请更改字符串。

#23楼

function randomString($length = 5) {    return substr(str_shuffle(implode(array_merge(range('A','Z'), range('a','z'), range(0,9)))), 0, $length);}

#24楼

简短方法

这是生成随机字符串的最短方法


#25楼

要具体回答这个问题,有两个问题:

  1. 当您回显它时, $randstring不在范围内。
  2. 这些字符在循环中没有并置在一起。

这是包含更正的代码段:

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();

请注意,这会生成可预测的随机字符串。 如果要创建安全令牌, 。


#26楼

函数范围中的$randstring与调用它的范围不同。 您必须将返回值分配给变量。

$randstring = RandomString();echo $randstring;

或者直接回显返回值:

echo RandomString();

另外,在您的功能中,您会犯一些小错误。 在for循环中,您需要使用.=以便每个字符都附加到字符串中。 通过使用=您将用每个新字符覆盖它,而不是附加它。

$randstring .= $characters[rand(0, strlen($characters))];

#27楼

最后,我找到了一种获取随机和唯一值的解决方案。

我的解决方案是:

substr(md5(time()), 0, 12)

time总是返回时间戳,并且它始终是唯一的。 您可以将其与MD5配合使用以使其更好。


#28楼

我已经测试了大多数常用功能的性能,在我的盒子上生成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()。

为了回答这个问题:该字符串未连接但被覆盖,并且函数的结果未存储。


#29楼

PHP 5.1.0开始工作,仅使用PHP本机函数进行参数化的单行代码

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))))))

#30楼

/** * @param int $length * @param string $abc * @return string */function generateRandomString($length = 10, $abc = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"){    return substr(str_shuffle($abc), 0, $length);}

来自


#31楼

有更好的替代方法。 已经发布了许多内容,因此我只提供修复后的内容:

另外,您可能对以下内容感兴趣:

'; //.. OR .. $randstring = ''; echo(RandomString());?>

或另一个:

转载地址:http://xpdnb.baihongyu.com/

你可能感兴趣的文章
Oracle Flashback 闪回查询功能操作范例(9i and 10g)
查看>>
parentNode、parentElement,childNodes、children 它们有什么
查看>>
prototype.js用法
查看>>
MySQL实用命令
查看>>
iframe透明属性使用
查看>>
js string 对象的一些扩展
查看>>
mysqldump 备份数据的一些用法
查看>>
Oracle SQL Loader数据导入
查看>>
使用Oracle数据库时常用的操作命令
查看>>
Set接口与Map接口的区别
查看>>
java中线性表,链表,哈希表是常用的数据结构
查看>>
Tomcat: Connector中HTTP与AJP区别
查看>>
Bootstrap 弹出框(Popover)插件
查看>>
超美的头发编发
查看>>
CSS响应式 Web 设计(一) - Viewport
查看>>
Bootstrap UI 编辑器
查看>>
CSS Fonts(字体)
查看>>
CSS 列表样式(ul)
查看>>
CSS 盒子模型(Box Model)和轮廓(outline)
查看>>
CSS Border(边框)
查看>>