2012-07-02 56 views
1

我试图为我的网站上创建的每个用户帐户创建一个“确认代码”,并将它与他们的个人信息一起存储在数据库中。正如你在下面的例子中看到的,我试图在时间变量中生成一个随机的字符串因子,但是这个字符串不是很长。生成一个10位数字的随机确认字符串php

我想要的字符串比md5生成的字符串短我在想是否有一个相对简单的方法来生成10位数字(最大)的字母数字字符串,其冲突率极低?

我的尝试:

md5(mt_rand(10000,99999).time() . '[email protected]'); 

输出:

0dd6854dba19e70cfda0ab91595e0376 
+1

为什么你关心的是字符串的长度?长串有什么问题? – tkone

+0

如果用户需要他们的帐户帮助,并要求他们的确认号码,那么没有30个以上的字符串会更容易,特别是如果他们有1个字符错误... – AnchovyLegend

+5

@MHZ:我想你可以使用你现有的MD5字符串,并采取前10个字符? – houbysoft

回答

3

PHP提供了openssl_random_pseudo_bytes功能,可以安全地做你想做的事。

做这样的事情:

bin2hex(openssl_random_pseudo_bytes(5)) 

上述会给你像e9d196aa14,例如。

另外,只需要现有的MD5字符串的前10个字符。

+0

这种方法很不错。谢谢您的帮助!我试图决定是否应该使用在我的初始文章中生成的长字符串的前10个字符,或者这种方法... – AnchovyLegend

+1

@MHZ这在技术上可能是最正确的答案,但对于非加密可能是矫枉过正使用。既然你不是以哈希码为基础的安全性,那么考虑MD5的前十个字符可能没问题。 – Jazz

+0

矫枉过正在哪里?它创建了一个相对较短的随机字符串,碰撞率可以忽略不计,对吧?用这种方法我不会更好吗?考虑到它用更少的代码完成任务:) – AnchovyLegend

0

这将生成Aa-Zz0-9个字符的任意随机输出字符串。

function genString($length) { 
    $lowercase = "qwertyuiopasdfghjklzxcvbnm"; 
    $uppercase = "ASDFGHJKLZXCVBNMQWERTYUIOP"; 
    $numbers = "1234567890"; 
    $specialcharacters = "{}[];:,./<>[email protected]#"; 
    $randomCode = ""; 
    mt_srand(crc32(microtime())); 
    $max = strlen($lowercase) - 1; 
    for ($x = 0; $x < abs($length/3); $x++) { 
     $randomCode .= $lowercase{mt_rand(0, $max)}; 
    } 
    $max = strlen($uppercase) - 1; 
    for ($x = 0; $x < abs($length/3); $x++) { 
     $randomCode .= $uppercase{mt_rand(0, $max)}; 
    } 
    $max = strlen($specialcharacters) - 1; 
    for ($x = 0; $x < abs($length/3); $x++) { 
     $randomCode .= $specialcharacters{mt_rand(0, $max)}; 
    } 
    $max = strlen($numbers) - 1; 
    for ($x = 0; $x < abs($length/3); $x++) { 
     $randomCode .= $numbers{mt_rand(0, $max)}; 
    } 
    return str_shuffle($randomCode); 
} 

使用

$str = genString(10); 
0

我认为最好的办法是

$random = substr(number_format(time() * rand(),0,'',''),0,10); // you can increase the digits by changing 10 to desired digit 

请检查出来