gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:38 25 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 也可用于密码检索。这意味着我需要限制 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/29628488/

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