Php 如何使随机字符串生成器过滤掉重复的字符串?

Php 如何使随机字符串生成器过滤掉重复的字符串?,php,string,random,generator,Php,String,Random,Generator,我制作了一个字符串生成器: <?php function createRandomPassword() { $chars = "abcdefghijkmnopqrstuvwxyz023456789"; srand((double)microtime()*1000000); $i = 0; $pass = '' ; while ($i <= 12) { $num = rand() % 33; $tmp =

我制作了一个字符串生成器:

    <?php

function createRandomPassword() {
    $chars = "abcdefghijkmnopqrstuvwxyz023456789";
    srand((double)microtime()*1000000);
    $i = 0;
    $pass = '' ;
    while ($i <= 12) {
        $num = rand() % 33;
        $tmp = substr($chars, $num, 1);
        $pass = $pass . $tmp;
        $i++;
    }
    return $pass;
}


// Usage
$product_names = array ();
for ($i=0; $i < 100; $i++ )
$product_names[] = "code-" . createRandomPassword();
?>

我的问题是,我认为这可能会复制值,这一点非常重要,因为我将生成大约700000个值

有没有一种好方法可以确保生成的字符串不重复

谢谢:)

几个选项:

  • 生成700000个唯一字符串并将其洗牌
  • 使用

  • 虽然您的代码表明它们被用作密码;如果它们确实存在,那么就不用担心重复项,因为没有明显的更可能的候选项(例如,
    password
    qwerty123
    )。

    以下示例将生成100个产品名称,删除重复项并生成新的产品名称,直到产品名称数组的计数为100为止

    $cnt = 0;
    $product_names = array ();
    while($cnt < 100) {
       for ($i=0; $i < 100 - $cnt; $i++ )
         $product_names[] = "code-" . createRandomPassword();
       $product_names = array_unique($product_names);
       $cnt = count($product_names);
    }
    
    $cnt=0;
    $product_NAME=array();
    而($cnt<100){
    对于($i=0;$i<100-$cnt;$i++)
    $product_NAME[]=“代码-”.createRandomPassword();
    $product\U NAME=数组\U unique($product\U NAME);
    $cnt=计数($product\U名称);
    }
    

    您可以将数字100放入变量或常量中,并与700000进行交换

    创建一个查找/检查表(在数据库或文件中)或生成一个算法来生成更好的唯一密钥(使用md5或sha或设计为唯一的东西)。

    为什么要这么麻烦呢?只需使用sha1()或md5()。同样,您也不会在循环的每次迭代中重新为PRNG设定种子。您只需对其进行一次种子设定,php会在您第一次调用rand()时自动为您执行此操作。实际上,如果你在测试并且每次都想要相同的“随机”流,你只需要手动种子。这里有些吹毛求疵:SHA1和MD5不是设计为无碰撞的,但是有非常非常低的碰撞概率(这意味着它们在实践中应该是无碰撞的)。@chiborg:理解,并受到好评,然而,根据OP的帖子,与使用rand()和固定字符串相比,任何有[甚至]1%碰撞概率的东西都是一个巨大的改进。