如何可能生成一个随机的,唯一的字符串使用数字和字母用于验证链接?就像你在一个网站上创建了一个账户,它会给你发一封带有链接的电子邮件,你必须点击那个链接才能验证你的账户

如何使用PHP生成其中一个?


当前回答

当尝试生成一个随机密码时,您正在尝试:

首先生成一组加密安全的随机字节 第二是将这些随机字节转换为可打印的字符串

现在,在php中有多种生成随机字节的方法,例如:

$length = 32;

//PHP 7+
$bytes= random_bytes($length);

//PHP < 7
$bytes= openssl_random_pseudo_bytes($length);

然后你想把这些随机字节转换成一个可打印的字符串:

你可以使用bin2hex:

$string = bin2hex($bytes);

或者base64_encode:

$string = base64_encode($bytes);

但是,请注意,如果使用base64,则不能控制字符串的长度。 你可以使用bin2hex来做到这一点,使用32字节将变成一个64字符的字符串。 但它只会在EVEN字符串中这样工作。

所以基本上你可以这样做:

$length = 32;

if(PHP_VERSION>=7){
    $bytes= random_bytes($length);
}else{
    $bytes= openssl_random_pseudo_bytes($length);
} 

$string = bin2hex($bytes);

其他回答

生成一个随机数使用 你最喜欢的随机数 发电机 乘除 得到一个与数字匹配的数字 你的代码字母表中的字符 将该索引处的项插入 你的代码字母。 重复1),直到你有你想要的长度 想要

例如(伪代码)

int myInt = random(0, numcharacters)
char[] codealphabet = 'ABCDEF12345'
char random = codealphabet[i]
repeat until long enough

我喜欢在处理验证链接时使用散列键。我建议使用微时间和使用MD5的哈希,因为没有理由为什么键应该是相同的,因为它是基于微时间哈希的。

$key = md5(rand()); $key = md5(微时间());

对于真正随机的字符串,你可以用

<?php

echo md5(microtime(true).mt_Rand());

输出:

40a29479ec808ad4bcff288a48a25d5c

因此,即使您尝试在同一时间多次生成字符串,也会得到不同的输出。

安全注意:在随机性质量可能影响应用程序安全性的情况下,不应使用此解决方案。特别是,rand()和uniqid()不是加密安全的随机数生成器。关于安全的替代方案,请参阅Scott的回答。

如果你不需要它随着时间的推移是绝对唯一的:

md5 (uniqid (rand()、true))

否则(假设你已经为你的用户确定了一个唯一的登录):

md5(uniqid($your_user_login, true))

这是一个有趣的问题

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偷来的