gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 17:45:41 24 4
gpt4 key购买 nike

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

如何使用 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],但它可以工作。

<小时/>下面是我可以做的满足标准的最强函数(这是埃里克答案的实现版本)。
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/49836845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com