【问题标题】:How generate UNIQUE random number in php [duplicate]如何在php中生成唯一的随机数[重复]
【发布时间】:2012-01-12 11:41:29
【问题描述】:

可能重复:
Algorithm for generating a random number

您好,我需要为数据库中的某些条目分配一个随机生成的数字,并且它必须是唯一的。 我用:

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

但是,两个随机数相同的可能性总是很小。 然后我可以做类似的事情:

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();
}

但这只会检查一次号码,并且仍然有可能新生成的号码已经存在于数据库中。

有什么建议吗? 谢谢

【问题讨论】:

标签: php mysql database random


【解决方案1】:

这是一个你可以使用的方法:

<?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 

?>

【讨论】:

    【解决方案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);
    

    可以用更少的行编写此代码。

    【讨论】:

      【解决方案3】:
      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”中得到了唯一的号码

      【讨论】:

      • 谢谢,在写这个问题时正在考虑类似的事情。会尽快尝试的。
      • 您听说过WHERE 子句吗?
      【解决方案4】:
      md5( strtotime("now").$_SERVER['REMOTE_ADDR'] );
      

      strtotime("now") 会给你一个唯一的数字,但是如果你使用这个脚本来处理来自多个用户的表单/上传等,IP 地址将只是确定这一点(在确切的情况下同样的第二个两个条目......这甚至会发生吗??嗯......)

      md5() 因为我喜欢它:D

      【讨论】:

      • 嗯,是的,但是在同一秒从同一 IP 访问服务器的两个请求将创建相同的随机数 -> 不是唯一的。多个用户可能在代理后面,或者一个用户可能正在双击。您可以使用微时间来获得更多差异。哦,md5 不会生成数字。
      • aha,这很有意义。我想到了会话 ID...尝试利用 php 已经内置的强大功能,因为我可以看到基于 mysql 循环的解决方案很慢
      • 因为数字在表中必须是唯一的,所以 not 使用 php 生成数字但在 mysql 中生成表中已有的数字是有意义的。否则,当数字确实存在时,您将不得不多次尝试插入。到数据库的往返费用很高。
      • 好的,我想更多的是跳过任何检查和验证,并且能够 100% 依赖生成的数字是唯一的。这样,您生成一次,查询一次,然后继续。你怎么看?
      猜你喜欢
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      相关资源
      最近更新 更多