2012-01-12 90 views
1

可能重複:
Algorithm for generating a random number如何在PHP中生成唯一的隨機數

嗨,我需要一個隨機生成的數字到某些條目分配到數據庫中,它必須是唯一的。 我使用:

$random_number = mt_rand(); 
mysqli_query($db_connection, "INSERT INTO my_table (rand_num, blabla) VALUES ('$random_number', '$blabla')"); 

但OFC有可能永遠是一個稍低的機會,2條隨機數將是相同的。 然後我可以這樣做:

function random_check($random_number) { 
    require_once('db_access.php'); 
    $random_check = mysqli_query($db_connection, "SELECT rand_num FROM my_table"); 
    mysqli_close($db_connection); 
    $result = 1; 
    while($row = mysqli_fetch_array($random_check)){ 
      if ($row['rand_num'] == $random_number) { 
      $result=0 
      } 
    } 
     return $result; 
}; 

$random_number = mt_rand(); 
$random_check = random_check($random_number); 
if ($random_check == 0) { 
     $random_number = mt_rand(); 
} 

但這隻會覈對數量一次,仍然會有機會,新生成的號碼已經存在到數據庫。

有什麼建議嗎? 感謝

+5

爲什麼不能使用自動增量?此外,您在詢問之前檢查過哪些人:http://stackoverflow.com/search?q=random+number+mysql以及爲什麼他們沒有解決您的問題? – Gordon 2012-01-12 11:47:02

+0

如果你不能使用自動增量,它可以是一個字符串? – Umut 2012-01-12 12:02:25

+1

看看[生日悖論上的這個問題](http://stackoverflow.com/questions/2145510/python-random-is-barely-random-at-all)關於PRNGs和隨機數唯一性的討論。 – ConcernedOfTunbridgeWells 2012-01-12 12:23:57

回答

2

這裏是您可以使用的方法:

<?php 
$num= mt_rand(); 
$con = mysql_connect("localhost","uname","password"); 
mysql_select_db("dbname",$con); 
$sel_query = "SELECT * FROM my_table WHERE rand_num =%d"; // query to select value 
$ins_query = "INSERT INTO my_table(rand_num) VALUES(%d)"; // query to insert value 
$result = mysql_query(sprintf($sel_query,$num),$con); 
while(mysql_num_rows($result) != 0) {      // loops till an unique value is found 
    $num = mt_rand(); 
    $result = mysql_query(sprintf($sel_query,$num),$con); 
} 
mysql_query(sprintf($ins_query,$num),$con); // inserts value 

>

0
function random_check($random_number) { 
    require_once('db_access.php'); 
    $random_check = mysqli_query($db_connection, "SELECT rand_num FROM my_table"); 
    mysqli_close($db_connection); 
    while($row = mysqli_fetch_array($random_check)){ 
      if ($row['rand_num'] == $random_number) { 
      return false; 
      } 
    } 
    return true; 
}; 

while(!random_check(mt_rand()){ 
    $myNumbber = random_check(mt_rand(); 
} 

- >現在你長了在 「mynumber的」

+0

謝謝,在寫這個問題時正在考慮類似的事情。 要儘快嘗試。 – g0dl3ss 2012-01-12 11:48:50

+4

您是否聽說過WHERE條款? – 2012-01-12 12:01:14

0
md5(strtotime("now").$_SERVER['REMOTE_ADDR']); 

的strtotime( 「現在」)會給你一個唯一的編號,但ifyou使用這個腳本來處理表格的唯一編號/上傳等從多個用戶,IP地址將只是使某些(關於在完全相同的第二個條目作出...甚至可能會發生??嗯... ...)

md5 ()COS我覺得喜歡它:D

+0

mhm,是的,但是兩個請求在相同IP的同一秒內點擊服務器將創建相同的隨機數,然後 - >不唯一。多個用戶可以位於代理之後,或者一個用戶可以雙擊。你可以使用microtime更多的方差。哦,和MD5不會生成一個數字。 – Gordon 2012-01-12 11:57:28

+0

啊哈,這使得sense.session ID的腦海中浮現......試圖利用已經內置的精美的PHP,因爲我可以看到一個基於mysql循環的溶劑正在緩慢 – Umut 2012-01-12 11:59:01

+0

因爲數字必須在表中是唯一的,它是有道理的*不*使用php生成數字,而是在mysql內部生成與表中已有內容相關的數字。否則當號碼已經存在時,您將不得不多次嘗試插入。往返到數據庫是昂貴的。 – Gordon 2012-01-12 12:01:31

2

做一個SELECT rand_num FROM my_table並檢查結果值是非常非常低效的。使用WHERE子句:

do { 
    $random_number = mt_rand(); 
    $query_object = mysqli_query($db_connection, "SELECT 1 FROM my_table WHERE rand_num = $random_number"); 
    $query_record = mysqli_fetch_array($query_object); 
    if(! $query_record) { 
     break; 
    } 
} while(1); 

可以用較少的行編寫此代碼。