我正在寻找生成随机/唯一字符串的最短路径,为此我使用了以下两种:
$cClass = sha1(time());
或
$cClass = md5(time());
但是,我需要字符串以字母字符开头,我正在查看base64编码,但最后会添加==
然后我需要摆脱它。
使用一行代码实现这一目标的最佳方法是什么?
更新
PRNDL提出了一个很好的建议,我最终使用它,但有点修改
echo substr(str_shuffle(abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ),0, 1) . substr(str_shuffle(aBcEeFgHiJkLmNoPqRstUvWxYz0123456789),0, 31)
会产生32个字符,模仿md5哈希值,但它总会产生第一个字母,就像字母一样;
然而, Uours 真的改善了他的答案;
substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1).substr(md5(time()),1);
更短更甜美
Anonymous2011 的另一个建议非常棒,但由于某种原因,第一个角色总是M,N,Y,Z因此不适合我的目的但是会选择答案,顺便说一下谁都知道为什么它会总是产生那些特定的字母?
以下是我修改版本的预览
echo rtrim(base64_encode(md5(microtime())),"=");
答案 0 :(得分:29)
不是改变字母串,而是获得单个随机字符更快。
从字符串中获取一个随机字符,然后将md5( time( ) )
附加到其中。在附加md5( time( ) )
之前,从中删除一个字符,以便将结果字符串长度保持为32个字符:
substr("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", mt_rand(0, 51), 1).substr(md5(time()), 1);
小写版本:
substr("abcdefghijklmnopqrstuvwxyz", mt_rand(0, 25), 1).substr(md5(time()), 1);
甚至更短,更小一点的小写版本:
chr(mt_rand(97, 122)).substr(md5(time()), 1);
/* or */
chr(mt_rand(ord('a'), ord('z'))).substr(md5(time()), 1);
对于试图在一秒内生成许多随机字符串的任何人的注释:
由于 time( )
以秒为单位返回时间, md5( time( ) )
在给定的第二个时间段内是相同的,因为如果在一秒钟内生成许多随机字符串,那些可能最终会产生一些重复。 < / p>
我已经使用以下代码进行了测试。这测试小写版本:
$num_of_tests = 100000;
$correct = $incorrect = 0;
for( $i = 0; $i < $num_of_tests; $i++ )
{
$rand_str = substr( "abcdefghijklmnopqrstuvwxyz" ,mt_rand( 0 ,25 ) ,1 ) .substr( md5( time( ) ) ,1 );
$first_char_of_rand_str = substr( $rand_str ,0 ,1 );
if( ord( $first_char_of_rand_str ) < ord( 'a' ) or ord( $first_char_of_rand_str ) > ord( 'z' ) )
{
$incorrect++;
echo $rand_str ,'<br>';
}
else
{
$correct++;
}
}
echo 'Correct: ' ,$correct ,' . Incorrect: ' ,$incorrect ,' . Total: ' ,( $correct + $incorrect );
答案 1 :(得分:26)
我找到了类似的东西:
$length = 10;
$randomString = substr(str_shuffle(md5(time())),0,$length);
echo $randomString;
答案 2 :(得分:6)
我认为这个问题需要更好的答案。像代码高尔夫!这也使用了更好的随机字节生成器。
preg_replace("/[\/=+]/", "", base64_encode(openssl_random_pseudo_bytes(8)));
显然,增加更长密码的字节数。
答案 3 :(得分:6)
如果您需要以字母开头,您可以这样做。这很麻烦......但它是一条线。
$randomString = substr(str_shuffle("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 1) . substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 10);
echo $randomString;
答案 4 :(得分:4)
base_convert(microtime(true), 10, 36);
答案 5 :(得分:4)
答案 6 :(得分:3)
我已为您生成此代码。简单,简短,(合理)优雅。
如果长度对你不重要,它会使用你提到的base64 - 但是它使用str_replace删除了“==”。
<?php
echo str_ireplace("==", "", base64_encode(time()));
?>
答案 7 :(得分:3)
你可以试试这个:
master
答案 8 :(得分:2)
我使用此功能
用法:
echo randomString(20, TRUE, TRUE, FALSE);
/**
* Generate Random String
* @param Int Length of string(50)
* @param Bool Upper Case(True,False)
* @param Bool Numbers(True,False)
* @param Bool Special Chars(True,False)
* @return String Random String
*/
function randomString($length, $uc, $n, $sc) {
$rstr='';
$source = 'abcdefghijklmnopqrstuvwxyz';
if ($uc)
$source .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
if ($n)
$source .= '1234567890';
if ($sc)
$source .= '|@#~$%()=^*+[]{}-_';
if ($length > 0) {
$rstr = "";
$length1= $length-1;
$input=array('a','b','c','d','e','f','g','h','i','j,''k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z')
$rand = array_rand($input, 1)
$source = str_split($source, 1);
for ($i = 1; $i <= $length1; $i++) {
$num = mt_rand(1, count($source));
$rstr1 .= $source[$num - 1];
$rstr = "{$rand}{$rstr1}";
}
}
return $rstr;
}
答案 9 :(得分:2)
这实际上取决于您的要求。
我需要字符串在测试运行之间是唯一的,但没有很多其他限制。
我还需要我的字符串以字符开头,这对我的目的来说已经足够了。
$mystring = "/a" . microtime(true);
示例输出:
a1511953584.0997
答案 10 :(得分:1)
以下单线满足您问题的要求:显然,它以字母开头。
substr("abcdefghijklmnop",random_int(0, 16),1) . bin2hex(random_bytes(15))
如果您不在乎字符串是否以字母开头,则可以使用:
bin2hex(random_bytes(16))
请注意,这里我们使用PHP 7中引入的random_bytes
和random_int
并使用加密随机生成器,如果您希望难以猜测唯一字符串,那么这很重要。许多其他解决方案,包括涉及time()
,microtime()
,uniqid()
,rand()
,mt_rand()
,str_shuffle()
和array_rand()
的解决方案,如果随机字符串用作密码,承载凭证,随机数,会话标识符,“验证码”或“确认码”或其他机密值,则更容易预测且不合适。
在生成唯一标识符(尤其是随机标识符)时,我还会列出other things to keep in mind。
答案 11 :(得分:1)
如何以糟糕的方式匹配OP原始请求(为了可读性而扩展):
// [0-9] ASCII DEC 48-57
// [A-Z] ASCII DEC 65-90
// [a-z] ASCII DEC 97-122
// Generate: [A-Za-z][0-9A-Za-z]
$r = implode("", array_merge(array_map(function($a)
{
$a = [rand(65, 90), rand(97, 122)];
return chr($a[array_rand($a)]);
}, array_fill(0, 1, '.')),
array_map(function($a)
{
$a = [rand(48, 57), rand(65, 90), rand(97, 122)];
return chr($a[array_rand($a)]);
}, array_fill(0, 7, '.'))));
最后一个array_fill()会改变&#39; 7&#39;你的长度 - 1。
对于那个完成所有alpha-nurmeric(并且仍然很慢)的人:
// [0-9A-Za-z]
$x = implode("", array_map(function($a)
{
$a = [rand(48, 57), rand(65, 90), rand(97, 122)];
return chr($a[array_rand($a)]);
}, array_fill(0, 8, '.')));
答案 12 :(得分:1)
生成字符串由随机字符组成,您可以使用此函数
public function generate_random_name_for_file($length=50){
$key = '';
$keys = array_merge(range(0, 9), range('a', 'z'));
for ($i = 0; $i < $length; $i++) {
$key .= $keys[array_rand($keys)];
}
return $key;
}
答案 13 :(得分:1)
我发现base64编码对于创建随机字符串很有用,请使用以下行:
base64_encode(openssl_random_pseudo_bytes(9));
它为我提供了一个由12个位置组成的随机字符串,其附带好处是随机性是加密强度&#34;。
答案 14 :(得分:1)
此函数返回随机小写字符串:
function randomstring($len=10){
$randstr='';
for($iii=1; $iii<=$len; $iii++){$randstr.=chr(rand(97,122));};
return($randstr);
};
答案 15 :(得分:1)
JavaScript解决方案:
function randomString(pIntLenght) {
var strChars = “0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz”;
var strRandomstring = ”;
for (var intCounterForLoop=0; intCounterForLoop < pIntLenght; intCounterForLoop++) {
var rnum = Math.floor(Math.random() * strChars.length);
strRandomstring += strChars.substring(rnum,rnum+1);
}
return strRandomstring;
}
alert(randomString(20));
参考网址:Generate random string using JavaScript
PHP解决方案:
function getRandomString($pIntLength = 30) {
$strAlphaNumericString = ’0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;
$strReturnString = ”;
for ($intCounter = 0; $intCounter < $pIntLength; $intCounter++) {
$strReturnString .= $strAlphaNumericString[rand(0, strlen($strAlphaNumericString) - 1)];
}
return $strReturnString;
}
echo getRandomString(20);
答案 16 :(得分:1)
我正在使用这个来一次生成几十个独特的字符串,而不是重复它们,基于上面的其他好例子:
$string = chr(mt_rand(97, 122))
. substr(md5(str_shuffle(time() . rand(0, 999999))), 1);
这样,我就能在~5秒内生成1.000.000个独特的字符串。我知道,这并不是那么快,但是因为我只需要一把它们,我很好。顺便说一句,生成10个字符串的时间不到0.0001毫秒。