Php 防止重复随机码生成?

Php 防止重复随机码生成?,php,recursion,Php,Recursion,我需要防止生成的代码产生重复。这是正确的方法还是有更有效的方法 function generate_code () { $s = get_random_code(); // check if code is already in db if (is_in_db($s)) return generate_code(); else return $s; } 可以使用while循环,以避免可能的递归深度限制: funct

我需要防止生成的代码产生重复。这是正确的方法还是有更有效的方法

function generate_code ()
{       
    $s = get_random_code();

    // check if code is already in db
    if (is_in_db($s))
        return generate_code();
    else
        return $s;
}

可以使用while循环,以避免可能的递归深度限制:

function generate_code ()
{       
    $s = get_random_code();

    // check if code is already in db
    while (is_in_db($s))
        $s = get_random_code();

    return $s;
}

如果生成一个代码后,生成了另一个重复的代码,该怎么办

function generate_code () 
{        
    $s = get_random_code(); 

    // check if code is already in db 
    while (is_in_db($s)) { 
      $s = get_random_code(); 
    } 

    return $s; 
} 

不需要做递归。

是的,有。连接primarykey,如果需要,添加一些唯一的列。把它搞糟。我不完全确定,但是从两个不同的值得到相同哈希值的风险非常低。有人说,你更有可能赢得彩票,被小行星摧毁,同时被闪电击中。

无需检查数据库

<?php

    uniqid (rand(), true); 

?>


您应该添加一个递归limit@MathieuImbert你是怎么做到的?它只是计数器变量吗?或者您可以在代码的末尾或开头添加一个唯一的变量,即存储代码的表的下一个可用ID或php中的uniqid函数。这样,它们将永远是独一无二的。脚本将运行得更快。请尝试或更好地嵌入时间,这样您就无需检查database@IMB您可以在函数
函数generate\u code($counter=0)
中传递一个计数器,然后使用
返回generate\u code($counter+1)调用后续函数。然后,您可以在函数中检查
$counter
的值,并在达到最大限制时抛出异常。
uniqid()
的问题是,您没有得到OP想要的随机分布。+1@MathieuImbert我已经包括在内,rand()。感谢指示此解决方案提供随机数而不使用数据库生成的代码具有自定义字符和8个字符的固定长度,因此uniqid()不适用于我。