2012-07-02 85 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 

請檢查出來