如何可能生成一个随机的,唯一的字符串使用数字和字母用于验证链接?就像你在一个网站上创建了一个账户,它会给你发一封带有链接的电子邮件,你必须点击那个链接才能验证你的账户
如何使用PHP生成其中一个?
如何可能生成一个随机的,唯一的字符串使用数字和字母用于验证链接?就像你在一个网站上创建了一个账户,它会给你发一封带有链接的电子邮件,你必须点击那个链接才能验证你的账户
如何使用PHP生成其中一个?
当前回答
安全注意:在随机性质量可能影响应用程序安全性的情况下,不应使用此解决方案。特别是,rand()和uniqid()不是加密安全的随机数生成器。关于安全的替代方案,请参阅Scott的回答。
如果你不需要它随着时间的推移是绝对唯一的:
md5 (uniqid (rand()、true))
否则(假设你已经为你的用户确定了一个唯一的登录):
md5(uniqid($your_user_login, true))
其他回答
我们可以使用这个代码。我测试了35000个id,没有重复。
<?php
$characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_';
$result = '';
for ($i = 0; $i < 11; $i++)
$result .= $characters[mt_rand(0, 63)];?>
您可以根据需要自由修改它。如果你有任何建议,请随意评论。建议您在使用这些id之前检查数据库中的每个id,这样您的数据库中就有100%唯一的id。
生成一个随机数使用 你最喜欢的随机数 发电机 乘除 得到一个与数字匹配的数字 你的代码字母表中的字符 将该索引处的项插入 你的代码字母。 重复1),直到你有你想要的长度 想要
例如(伪代码)
int myInt = random(0, numcharacters)
char[] codealphabet = 'ABCDEF12345'
char random = codealphabet[i]
repeat until long enough
对于真正随机的字符串,你可以用
<?php
echo md5(microtime(true).mt_Rand());
输出:
40a29479ec808ad4bcff288a48a25d5c
因此,即使您尝试在同一时间多次生成字符串,也会得到不同的输出。
我用了这样一句话:
base64_encode(openssl_random_pseudo_bytes(3 * ($length >> 2)));
其中length是所需字符串的长度(能被4整除,否则它会四舍五入到最接近的能被4整除的数字)
一个简单的解决方案是通过丢弃非字母数字字符将64进制转换为字母数字。
它使用random_bytes()来获得加密安全的结果。
function random_alphanumeric(int $length): string
{
$result='';
do
{
//Base 64 produces 4 characters for each 3 bytes, so most times this will give enough bytes in a single pass
$bytes=random_bytes(($length+3-strlen($result))*2);
//Discard non-alhpanumeric characters
$result.=str_replace(['/','+','='],['','',''],base64_encode($bytes));
//Keep adding characters until the string is long enough
//Add a few extra because the last 2 or 3 characters of a base 64 string tend to be less diverse
}while(strlen($result)<$length+3);
return substr($result,0,$length);
}
编辑:我只是重新审视了一下,因为我需要一些更灵活的东西。这里有一个解决方案,执行得比上面的好一点,并提供了指定ASCII字符集的任何子集的选项:
<?php
class RandomText
{
protected
$allowedChars,
//Maximum index to use
$allowedCount,
//Index values will be taken from a pool of this size
//It is a power of 2 to keep the distribution of values even
$distributionSize,
//This many characters will be generated for each output character
$ratio;
/**
* @param string $allowedChars characters to choose from
*/
public function __construct(string $allowedChars)
{
$this->allowedCount = strlen($allowedChars);
if($this->allowedCount < 1 || $this->allowedCount > 256) throw new \Exception('At least 1 and no more than 256 allowed character(s) must be specified.');
$this->allowedChars = $allowedChars;
//Find the power of 2 equal or greater than the number of allowed characters
$this->distributionSize = pow(2,ceil(log($this->allowedCount, 2)));
//Generating random bytes is the expensive part of this algorithm
//In most cases some will be wasted so it is helpful to produce some extras, but not too many
//On average, this is how many characters needed to produce 1 character in the allowed set
//50% of the time, more characters will be needed. My tests have shown this to perform well.
$this->ratio = $this->distributionSize / $this->allowedCount;
}
/**
* @param int $length string length of required result
* @return string random text
*/
public function get(int $length) : string
{
if($length < 1) throw new \Exception('$length must be >= 1.');
$result = '';
//Keep track of result length to prevent having to compute strlen()
$l = 0;
$indices = null;
$i = null;
do
{
//Bytes will be used to index the character set. Convert to integers.
$indices = unpack('C*', random_bytes(ceil(($length - $l) * $this->ratio)));
foreach($indices as $i)
{
//Reduce to the smallest range that gives an even distribution
$i %= $this->distributionSize;
//If the index is within the range of characters, add one char to the string
if($i < $this->allowedCount)
{
$l++;
$result .= $this->allowedChars[$i];
}
if($l >= $length) break;
}
}while($l < $length);
return $result;
}
}