Advanced Algoithm问题​​生成唯一的6个字符长代码

时间:2015-11-04 12:25:05

标签: php algorithm

我使用此算法生成100个代码。现在我再一次在发布之前搜索了这个网站和谷歌上的主题。找到的algorthms确实可以生成代码我得到的问题是我必须从我已经拥有的代码中生成UNIQUE代码。我发现的问题是所有脚本都无法执行。

所以基本上我有一个ARRAY持有100个优惠券代码,我需要生成400多个优惠券代码,但是当我的算法工作时,它会因为执行时间过长而保持计时。我已经在Stack溢出的线程上尝试了其他几种算法,但出于某种原因,它们都保持超时。我需要建议我可以对我的算法做些什么来实际生成400个更独特的6个Char码。

这是我有的脚本

/**
**Use this portion to get my current 100 codes in an array which i use
**/
$redeem = 'THIS IS A STRING WHICH CREATES AN ARRAY CONTIANING 100 VALUES'; 
$redeem = preg_replace('/\s+/', '', $redeem);
$redeem_code = str_split($redeem, 6);

/**
**Function generates unique 6 letter voucher codes
**
**/

        function random_str($length, $keyspace = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ')
        {
            $str = '';
            $max = mb_strlen($keyspace, '8bit') - 1;
            for ($i = 0; $i < $length; ++$i) {
            $str .= $keyspace[mt_rand(0, $max)];
            }
        return $str;
        }

/**
**This is the query which checks against my array and then echo's a valid code
**
**/
        $redeem_count = count($redeem_code);
        $i = 0;
        $ia = 1;
        while($i <= 500){

                $string = random_str(6);
                if(in_array($string, $redeem_code))
                {
                     echo $string;
                     $i= $i+1;
                }

        }

尝试了所有函数的常量错误消息。

Fatal error: Maximum execution time of 120 seconds exceeded in C:\wamp\www\nfr_chip.php on line 115

2 个答案:

答案 0 :(得分:1)

您永远不会向数组中添加任何内容,只有在代码已存在的情况下才会增加$ i。

这应该有用......

$redeem_count = count($redeem_code);

while($redeem_count <= 500) {

   $string = random_str(6);
   if(!in_array($string, $redeem_code))
   {
        $redeem_code[] = $string;
        $redeem_count++;
   }

}

对于使用代码分割字符串的方式,而不是使用preg_replace(除非您确实需要,否则请使用正则表达式):

$redeem_code = explode(" ", $redeem);

答案 1 :(得分:1)

您可以安全地使用openssl_random_pseudo_bytesbin2hex生成伪随机,顾名思义就是字符串。

以下是一个例子:

for ($i=1;$i<=5;$i++){
    print bin2hex(openssl_random_pseudo_bytes(3)) . PHP_EOL;
}

//output
9282fb
3b9798
c187a0
a058e3
df2e4b

3个字节将为您提供6个字符串