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

标签 php string random uniqueidentifier

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

如何使用 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/

相关文章:

PHP 变量(全局)似乎在下一个代码块中变为 NULL

字符指针

c++异常从字符串转换为c_str创建垃圾字符

c - 如何在c中创建带有随机数的 map

Numpy 根据另一个数组的值生成随机数组

javascript - 嵌套列表悬停问题

javascript - PHP、Javascript、选择和警报

PHP:获取与另一个字符串数组的子字符串匹配的字符串数组的数组值

java - 如何创建一个随机整数数组生成器

php - 我可以通过 1 个查询来完成此操作吗?