首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP:生成唯一的随机数字/ID

问PHP:生成唯一的随机数字/ID
EN

Stack Overflow用户
提问于 2011-01-23 21:15:13
回答 3查看 4.4K关注 0票数 0

我想要生成唯一和随机的数字或ID,我可以使用它们来进行电子邮件验证、帐户重置、成员邀请等。

例如,

代码语言:javascript
复制
http://mywebsite.com/member/9a5af103cd540aa 
http://mywebsite.com/invite/regitration/eef0dd2e0199640 
http://mywebsite.com/reset/account/eef0dd2e0199640 

这里我计划使用的代码,你认为它是安全和‘防弹’吗?

代码语言:javascript
复制
$rand = substr(hash('sha512',uniqid(rand(), true)), 0, 15);
echo $rand;

或者有更好的选择吗?

谢谢。

编辑:

在收到以下建议后,我研究了几个方案:

com_create_guid

代码语言:javascript
复制
function create_guid()
{
    if (function_exists('com_create_guid') === true)
    {
        return trim(com_create_guid(), '{}');
    }

    # fallback to mt_rand if php < 5 or no com_create_guid available
    return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));

    //return substr(hash('sha512',uniqid(rand(), true)), 0, 15);
}

openssl_random_pseudo_bytes

代码语言:javascript
复制
function generate_password($length = 24) {

    if(function_exists('openssl_random_pseudo_bytes')) {
        $password = base64_encode(openssl_random_pseudo_bytes($length, $strong));
        if($strong == TRUE)
            return substr($password, 0, $length); //base64 is about 33% longer, so we need to truncate the result
    }

    # fallback to mt_rand if php < 5.3 or no openssl available
    $characters = '0123456789';
    $characters .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/+'; 
    $charactersLength = strlen($characters)-1;
    $password = '';

    # select some random characters
    for ($i = 0; $i < $length; $i++) {
        $password .= $characters[mt_rand(0, $charactersLength)];
    }        

    return $password;
}

我从php.net中找到了这两个函数。

但我主要关心的是-这两个函数生成的数字/ is是否是唯一的?

mt_rand --据我所知,这会产生随机性,但不是唯一性--对吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-23 21:21:36

您可以使用openssl_random_pseudo_bytes ()函数生成任意数量的任意字节。

票数 3
EN

Stack Overflow用户

发布于 2011-01-23 21:20:01

您可以生成一个参考线,其目的和目的都是独特的。。

票数 0
EN

Stack Overflow用户

发布于 2011-01-23 21:21:00

我认为就你列出的目的而言,它是非常独特的。但我还是会检查复制件的,只是为了确定。机会很小,但仍然存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4776553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档