如何使用数字和字母生成随机的唯一字符串以用于验证链接?就像您在网站上创建帐户时,它会向您发送一封带有链接的电子邮件,您必须单击该链接才能验证您的帐户
如何使用 PHP 生成其中之一?
最佳答案
PHP 7 标准库提供了 random_bytes($length)
函数,可生成加密安全的伪随机字节。
例子:
$bytes = random_bytes(20);
var_dump(bin2hex($bytes));
上面的例子会输出类似于:
string(40) "5fe69c95ed70a9869d9f9af7d8400a6673bb9ce9"
更多信息:http://php.net/manual/en/function.random-bytes.php
PHP 5(过时)
我只是在研究如何解决同样的问题,但我也希望我的函数创建一个也可用于密码检索的 token 。这意味着我需要限制 token 被猜测的能力。因为uniqid
是基于时间的,根据php.net“返回值与microtime()相差不大”,uniqid
不符合条件。 PHP 建议使用 openssl_random_pseudo_bytes()
来生成加密安全 token 。
一个快速、简短且中肯的答案是:
bin2hex(openssl_random_pseudo_bytes($bytes))
这将生成一个长度为 = $bytes * 2 的字母数字字符的随机字符串。不幸的是,它只有一个 [a-f][0-9]
的字母表,但它可以工作。
以下是我可以满足标准的最强功能(这是 Erik 答案的实现版本)。
function crypto_rand_secure($min, $max)
{
$range = $max - $min;
if ($range < 1) return $min; // not so random...
$log = ceil(log($range, 2));
$bytes = (int) ($log / 8) + 1; // length in bytes
$bits = (int) $log + 1; // length in bits
$filter = (int) (1 << $bits) - 1; // set all lower bits to 1
do {
$rnd = hexdec(bin2hex(openssl_random_pseudo_bytes($bytes)));
$rnd = $rnd & $filter; // discard irrelevant bits
} while ($rnd > $range);
return $min + $rnd;
}
function getToken($length)
{
$token = "";
$codeAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$codeAlphabet.= "abcdefghijklmnopqrstuvwxyz";
$codeAlphabet.= "0123456789";
$max = strlen($codeAlphabet); // edited
for ($i=0; $i < $length; $i++) {
$token .= $codeAlphabet[crypto_rand_secure(0, $max-1)];
}
return $token;
}
crypto_rand_secure($min, $max)
可以替代 rand()
或 mt_rand
。它使用 openssl_random_pseudo_bytes 来帮助创建一个介于 $min 和 $max 之间的随机数。
getToken($length)
创建一个要在 token 中使用的字母,然后创建一个长度为 $length
的字符串。
来源:http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php#104322
关于php - 如何生成随机、唯一的字母数字字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1846202/