2011-01-23 134 views
0

我想生成独特随机数或ID,我可以使用他们的电子邮件验证,账户复位,会员邀请目的等PHP:生成独特随机数/ IDS

例如,

http://mywebsite.com/member/9a5af103cd540aa 
http://mywebsite.com/invite/regitration/eef0dd2e0199640 
http://mywebsite.com/reset/account/eef0dd2e0199640 

在这里,我打算使用的代码,你认为这是安全的和'防弹'?

$rand = substr(hash('sha512',uniqid(rand(), true)), 0, 15); 
echo $rand; 

还是有更好的选择?

谢谢。

编辑:

我从这里得到建议后,看着几个选项:

com_create_guid

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

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 = ''; 
    $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中发现了这两个函数。

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

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

+0

而不是base64_encode我会使用bin2hex – catalint 2014-03-06 11:56:26

回答

3

你可以使用openssl_random_pseudo_bytes()函数来生成任意数量的随机字节。

0

您可以生成一个GUID这对于所有意图和目的是unique.

+1

它在* Windows Only Extensions *类别。 – 2011-01-23 21:22:45

+0

'Windows Only Extensions'是什么意思? – laukok 2011-01-23 22:32:21

0

我想为你列出的目的,这是迄今为止足够的唯一。但我仍然会检查重复项目,只是为了确保。机会相当小,但仍然存在。