如何生成随机、唯一的字母数字字符串?

如何使用数字和字母生成用于验证链接的随机唯一字符串?比如,当你在网站上创建一个帐户时,它会向你发送一封带有链接的电子邮件,你必须单击该链接才能验证你的帐户

如何使用PHP生成其中一个

PHP7标准库提供了生成加密安全伪随机字节的random_bytes($length)函数

例如:

$bytes=随机字节(20);
变量转储(bin2hex($bytes));

上面的示例将输出类似于:

字符串(40)"5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9“;

更多信息:http://php.net/manual/en/function.random-bytes.php

PHP5(过时)

我只是在研究如何解决这个问题,但我也希望我的函数能够创建一个令牌,该令牌也可以用于密码检索。这意味着我需要限制令牌的猜测能力。因为uniqid是基于时间的,并且根据php.net;返回值与microtime()相差不大uniqid不符合标准。PHP建议使用openssl\u random\u pseudo\u bytes()来生成加密安全令牌

一个快速、简短且切中要害的答案是:

bin2hex(openssl_随机_伪_字节($bytes))

它将生成一个随机的字母数字字符串,长度=$bytes*2。不幸的是,它只有一个字母表[a-f][0-9],但它可以工作


下面是我能做的满足条件的最强函数(这是Erik答案的实现版本)。

函数加密和安全($min,$max)
{
$range=$max-$min;
如果($range<1)返回$min;//不太随机。。。
$log=ceil(log$range,2));
$bytes=(int)($log/8)+1;//字节长度
$bits=(int)$log+1;//以位为单位的长度
$filter=(int)(1<<$bits)-1;//将所有低位设置为1
做{
$rnd=hexdec(bin2hex(openssl_random_pseudo_bytes($bytes));
$rnd=$rnd&$filter;//丢弃不相关的位
}而($rnd>$range);
返回$min+$rnd;
}
函数getToken($length)
{
$token=";
$code字母表=“ABCDEFGHIJKLMNOPQRSTUVWXYZ”;;
$codeAlphabet.=“abcdefghijklmnopqrstuvwxyz”;;
$codeAlphabet.=“0123456789”;;
$max=strlen($codelphabet);//已编辑
对于($i=0;$i<$length;$i++){
$token.=$codeAlphabet[crypto_rand_secure(0,$max-1)];
}
返回$token;
}

crypto\u rand\u secure($min,$max)作为rand()mt\u rand的替代品。它使用openssl_random_pseudo_字节帮助创建一个介于$min和$max之间的随机数

getToken($length)创建一个要在令牌中使用的字母表,然后创建一个长度字符串$length

资料来源:http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322

发表评论