Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 伪随机串_Php_String - Fatal编程技术网

Php 伪随机串

Php 伪随机串,php,string,Php,String,我需要从这些字母生成代码 $a = array( 'B','C','D','F','G','H','J','K','L','M','N','O', 'P','Q','R','S','T','V','W','X','Y','Z','1','2', '3','4','5','6','7','8','9','0' ); 但有两个条件:每个代码必须是唯一的,并且包含10个字母。我不想随机,因为这是无效的。相反,我希望每个字母都可以,例如: bbbbbbbbbbbb bbbbbb

我需要从这些字母生成代码

$a = array(
    'B','C','D','F','G','H','J','K','L','M','N','O',
    'P','Q','R','S','T','V','W','X','Y','Z','1','2',
    '3','4','5','6','7','8','9','0'
);
但有两个条件:每个代码必须是唯一的,并且包含10个字母。我不想随机,因为这是无效的。相反,我希望每个字母都可以,例如:

  • bbbbbbbbbbbb
  • bbbbbbbbc
  • bbbbbbbbd

  • 等等。。有什么想法吗?

    最好只使用uniqid,尤其是考虑到您所说的将生成160万个代码。如果您关心这个案例,只需使用strtoupper()


    生成所有这些并插入它们需要相当长的时间

    我认为你真正想要的是一个序列号列表(因此根本不是随机的),带有一个非常非传统的基本系统。所以
    bbbbbbb
    0
    ,而
    bbbbbbb c
    1
    。这并不难做到,但显然你必须自己编写代码。类似的方法可能会奏效:

    <?php
    
    $length = 3;
    
    $letters = str_split("ABC"); // define your dictionary here
    
    $index = array_fill(0, $length, 0);
    
    $key = $length - 1;
    while(true) {   
        $code = "";
        for($i=0;$i<$length;$i++) {     
            $code .= $letters[$index[$i]];      
        }
        echo $code ."<br/>"; // output code
    
        $index[$key]++;
    
        while(!isset($letters[$index[$key]])) {
            $index[$key] = 0;
            $key--;
            if($key < 0) {
                break 2;
            }       
            $index[$key]++;
        }   
        $key = $length - 1; 
    }
    
    function generate($num) {
        $num = base_convert($num, 10, 32); // convert the number to base 32
        $num = str_pad($num, 10, "0", STR_PAD_LEFT); // pad it with zeros to the left
        $num = str_replace(array(
            '0','1','2','3','4','5','6','7','8','9','a','b',
            'c','d','e','f','g','h','i','j','k','l','m','n',
            'o','p','q','r','s','t','u','v'
        ), array(
            'B','C','D','F','G','H','J','K','L','M','N','O',
            'P','Q','R','S','T','V','W','X','Y','Z','1','2',
            '3','4','5','6','7','8','9','0'
        ), $num); // replace the normal characters with your custom array
    
        echo $num, "\n";
    }
    
    for ($i = 0; $i < 10; $i++) generate($i);
    

    为什么不直接使用像
    uniqid
    ?我可以保证这将比自己构建字符串更有效。我需要生成1,6mln代码并将它们保存到数据库中。如何使用uniqid?@PeterSzymkowski,是的,但它清楚地显示了它必须如何工作。lonesomeday的问题是,这个代码显然有效,但很难理解。您认为您可以使用描述性变量名,而不是
    $s
    $v
    等吗?聪明的解决方案,但相当简单slow@PeterSzymkowski嗯,是的。但让我们面对现实:如果速度是目标,那么解决方案就是使用简单的旧数字。+1对于这一点,绝对是完成任务最简单的答案。要考虑的一件事(这适用于任何一种方法)是,你需要立即将它存储在数据库中,因为用生成的值填充数组会消耗疯狂的内存量。难以置信的是,PeterSzymkowski的解决方案在我的DEV机器上的速度是6倍以上。好的解决方案,但是替换:$index=ARARYY();对于($i=0;$i)来说,它是一个代码板,具有OP要求的格式和字典。这确实比我的解决方案快了很多(5到10倍),所以是一个大+1。
    <?php
    
    $a = array(
        'B','C','D','F','G','H','J','K','L','M','N','O',
        'P','Q','R','S','T','V','W','X','Y','Z','1','2',
        '3','4','5','6','7','8','9','0'
    );
    
    function key_increment (&$symbols, $position = null) 
    {
        global $a;
        if ($position === null) $position = count($symbols) - 1;
        if ($position == -1) return;
    
        $index = $symbols[$position];
        $index ++;
        if (!isset($a[$index])) {
            $v = 0;
            key_increment ($symbols, $position-1);
        }
        $symbols[$position] = $value;
    }
    
    function generate($length, $total) 
    {
        global $a;
    
        $symbols = array_fill(0, $length, 0);
    
    
            for ($i = 0; $i < $total; $i ++) {
                $code = '';
            foreach ($symbols as $index) {
                $code .= $a[$index];
            }
            echo $code;
            echo '<br />';
    
            key_increment($symbols);
        }
    }
    
    generate(3, 100);
    
    function generate($num) {
        $num = base_convert($num, 10, 32); // convert the number to base 32
        $num = str_pad($num, 10, "0", STR_PAD_LEFT); // pad it with zeros to the left
        $num = str_replace(array(
            '0','1','2','3','4','5','6','7','8','9','a','b',
            'c','d','e','f','g','h','i','j','k','l','m','n',
            'o','p','q','r','s','t','u','v'
        ), array(
            'B','C','D','F','G','H','J','K','L','M','N','O',
            'P','Q','R','S','T','V','W','X','Y','Z','1','2',
            '3','4','5','6','7','8','9','0'
        ), $num); // replace the normal characters with your custom array
    
        echo $num, "\n";
    }
    
    for ($i = 0; $i < 10; $i++) generate($i);
    
    BBBBBBBBBB
    BBBBBBBBBC
    BBBBBBBBBD
    BBBBBBBBBF
    BBBBBBBBBG
    BBBBBBBBBH
    BBBBBBBBBJ
    BBBBBBBBBK
    BBBBBBBBBL
    BBBBBBBBBM