如何可能生成一个随机的,唯一的字符串使用数字和字母用于验证链接?就像你在一个网站上创建了一个账户,它会给你发一封带有链接的电子邮件,你必须点击那个链接才能验证你的账户
如何使用PHP生成其中一个?
如何可能生成一个随机的,唯一的字符串使用数字和字母用于验证链接?就像你在一个网站上创建了一个账户,它会给你发一封带有链接的电子邮件,你必须点击那个链接才能验证你的账户
如何使用PHP生成其中一个?
当前回答
如果您想在PHP中生成一个唯一的字符串,请尝试以下操作。
md5(uniqid().mt_rand());
在这方面,
uniqid() -它将生成唯一的字符串。此函数返回基于时间戳的唯一标识符作为字符串。
mt_rand() -生成随机数。
md5() -它将生成哈希字符串。
其他回答
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(过时)
我只是在寻找如何解决这个相同的问题,但我也希望我的函数创建一个令牌,可以用于密码检索以及。这意味着我需要限制令牌的猜测能力。因为uniqid是基于时间的,而根据php.net“返回值与microtime()相差不大”,uniqid不符合条件。PHP建议使用openssl_random_pseudo_bytes()来生成加密安全的令牌。
一个快速、简短、直截了当的答案是:
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)创建一个要在令牌中使用的字母表,然后创建一个长度为$length的字符串。
来源:http://us1.php.net/manual/en/function.openssl-random-pseudo-bytes.php # 104322
这是一个有趣的问题
public function randomStr($length = 16) {
$string = '';
while (($len = strlen($string)) < $length) {
$size = $length - $len;
$bytes = random_bytes($size);
$string .= substr(str_replace(['/', '+', '='], '', base64_encode($bytes)), 0, $size);
}
return $string;
}
从laravel偷来的
使用下面的代码生成11个字符的随机数或根据您的要求更改数字。
$randomNum=substr(str_shuffle("0123456789abcdefghijklmnopqrstvwxyz"), 0, 11);
或者我们可以使用自定义函数来生成随机数
function randomNumber($length){
$numbers = range(0,9);
shuffle($numbers);
for($i = 0;$i < $length;$i++)
$digits .= $numbers[$i];
return $digits;
}
//generate random number
$randomNum=randomNumber(11);
如果您想在PHP中生成一个唯一的字符串,请尝试以下操作。
md5(uniqid().mt_rand());
在这方面,
uniqid() -它将生成唯一的字符串。此函数返回基于时间戳的唯一标识符作为字符串。
mt_rand() -生成随机数。
md5() -它将生成哈希字符串。
我们可以使用这个代码。我测试了35000个id,没有重复。
<?php
$characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_';
$result = '';
for ($i = 0; $i < 11; $i++)
$result .= $characters[mt_rand(0, 63)];?>
您可以根据需要自由修改它。如果你有任何建议,请随意评论。建议您在使用这些id之前检查数据库中的每个id,这样您的数据库中就有100%唯一的id。