簡體   English   中英

調用遞歸函數的最合適方法是什么?

[英]What's the most appropriate way to re-call a recursive function?

有人告訴我authCode(); 不會以最有效的方式來調用它,因為它將“堆疊許多DB連接,快速打開和關閉它們,這在資源方面是昂貴的”。

這是我的代碼:

function authCode() {

$num1 = mt_rand(1, 2147483647);
$num2 = mt_rand(1, 2147483647); 
$authcode = dechex($num1).dechex($num2);;

include("../db/71cfde725dc86.php");

$conn = mysql_connect($db_host, $db_uname, $db_pword) or die("Couldn't connect because ".mysql_error()); mysql_select_db($db_name);
$query = "SELECT COUNT(*) FROM records WHERE valcode='$authcode'";
$result = mysql_query($query) or die("SELECT query failed due to ".mysql_error());

$count = mysql_fetch_assoc($result);
$row = $count['COUNT(*)'];

if($row > 0)
{
    $authcode = authCode();
}
else 
{
$query2 = "INSERT INTO records (valcode) VALUES ('$authcode')";
$result2 = mysql_query($query2) or die("INSERT query failed due to ".mysql_error());
}

mysql_close($conn);

return $authcode;
}

authCode();

我專注於$authcode = authCode(); 並且數據庫連接直到結束才關閉的事實,這是否表示它確實調用了連接仍處於打開狀態(所以我聽說過)?

我應該在分配$row之后關閉連接,然后在else語句中重新打開並關閉嗎?

您應該做的是在第一次調用authCode()之前打開連接,並將其作為參數傳遞。 這樣,您可以對所有呼叫使用單個連接。

您可以在函數中傳遞數據庫連接:

function authCode($conn) {
    if ($db_link == null) {
        $has_instantiated_connection = true;
        // set the connection
    }
    else
        $has_instantiated_connection = false;

    // stuff

    // recall
    authCode($conn)

    if ($has_instantiated_connection)
        // close the connection
}

絕對不需要遞歸運行此函數。 使用簡單的while循環,可以更輕松,更輕松地完成此操作。 用偽代碼:

function authCode() {
    ... connect to database ...
    while (true) {
       ... generate random code ...
       if (code is in database) {
           continue;
       } else {
          insert code into data base
          break;
       }
    }
    return $code
}

沒有遞歸,只有一個數據庫句柄。

除此之外,為什么還要這樣糟糕的代碼生成器? 您將獲得長度可變的代碼,發生沖突的可能性很高。 為什么不簡單地將sha1與正確加鹽的源字符串一起使用,該字符串與您的版本相比發生沖突的可能性要低得多。 您的代碼的理論鍵空間為32位,而md5為128位,sha2為160位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM