PHP如何成生1000W条4位的号码

不会武功的猪 发布于 2015/06/11 21:59
阅读 634
收藏 1
PHP

1234567890ABCDEFGHIGKLM....Z

生成4位数共1000W个不重复的。


加载中
0
notreami
notreami
C36~4*C36~3*3*C36~2*2*36..   小弟貌似记得这样就OK了。。好久不碰 概率了
不会武功的猪
不会武功的猪
用程序生成一下。怎么整。。
0
聽雨人
聽雨人
36^4 = 1 679 616 哪里来的千万个?
主编
主编
大小写混合后有多少
蟋蟀哥哥
蟋蟀哥哥
加字母加特殊符号吧
0
乌龙球
乌龙球
http://hashids.org 看下这个,1到一千万循环加密输出一下。
0
梦想岛
梦想岛
10进制换成36进制,
代码在这里。
http://www.jb51.net/article/51705.htm



class Code { 
    //密码字典 
    private $dic = array( 
        0=>'0',    1=>'1', 2=>'2', 3=>'3', 4=>'4', 5=>'5', 6=>'6', 7=>'7', 8=>'8',     
        9=>'9', 10=>'A',  11=>'B', 12=>'C', 13=>'D', 14=>'E', 15=>'F',  16=>'G',  17=>'H',     
        18=>'I',19=>'J',  20=>'K', 21=>'L',  22=>'M',  23=>'N', 24=>'O', 25=>'P', 26=>'Q',     
    27=>'R',28=>'S',  29=>'T',  30=>'U', 31=>'V',  32=>'W',  33=>'X', 34=>'Y', 35=>'Z' 
    ); 
 
 
    public function encodeID($int, $format=8) { 
        $dics = $this->dic; 
        $dnum = 36; //进制数 
        $arr = array (); 
        $loop = true; 
        while ($loop) { 
            $arr[] = $dics[bcmod($int, $dnum)]; 
            $int = bcdiv($int, $dnum, 0); 
            if ($int == '0') { 
                $loop = false; 
            } 
        } 
        if (count($arr) < $format) 
            $arr = array_pad($arr, $format, $dics[0]); 
 
        return implode('', array_reverse($arr)); 
    } 
 
    public function decodeID($ids) { 
        $dics = $this->dic; 
        $dnum = 36; //进制数 
        //键值交换 
        $dedic = array_flip($dics); 
        //去零 
        $id = ltrim($ids, $dics[0]); 
        //反转 
        $id = strrev($id); 
        $v = 0; 
        for ($i = 0, $j = strlen($id); $i < $j; $i++) { 
            $v = bcadd(bcmul($dedic[$id { 
                $i } 
            ], bcpow($dnum, $i, 0), 0), $v, 0); 
        } 
        return $v; 
    } 
 
} 



<?php
$code = new Code(); 
for($i=1;$i<10000000;$i++){
    $card_no = $code->encodeID($i,4);
}


测试。4位数不够用,最大1679615 == ZZZZ


Qianfeng
Qianfeng
base_convert .......
不会武功的猪
不会武功的猪
那我改成5位吧。
0
fxhover
fxhover

http://blog.csdn.net/yang3290325/article/details/8028670 这里有个排列组合的方法,你把$arr的值换成array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9)); 试试。

需要很多内存,你还得使用init_set('memory_limit', '1024M');去设置php可以使用的内存大小。

0
帖子列表
帖子列表
没错 用进制转换的思路
0
不会武功的猪
不会武功的猪

引用来自“聽雨人”的评论

36^4 = 1 679 616 哪里来的千万个?
哦。才这么点啊。。
0
不会武功的猪
不会武功的猪

引用来自“梦想岛”的评论

10进制换成36进制,
代码在这里。
http://www.jb51.net/article/51705.htm



class Code { 
    //密码字典 
    private $dic = array( 
        0=>'0',    1=>'1', 2=>'2', 3=>'3', 4=>'4', 5=>'5', 6=>'6', 7=>'7', 8=>'8',     
        9=>'9', 10=>'A',  11=>'B', 12=>'C', 13=>'D', 14=>'E', 15=>'F',  16=>'G',  17=>'H',     
        18=>'I',19=>'J',  20=>'K', 21=>'L',  22=>'M',  23=>'N', 24=>'O', 25=>'P', 26=>'Q',     
    27=>'R',28=>'S',  29=>'T',  30=>'U', 31=>'V',  32=>'W',  33=>'X', 34=>'Y', 35=>'Z' 
    ); 
 
 
    public function encodeID($int, $format=8) { 
        $dics = $this->dic; 
        $dnum = 36; //进制数 
        $arr = array (); 
        $loop = true; 
        while ($loop) { 
            $arr[] = $dics[bcmod($int, $dnum)]; 
            $int = bcdiv($int, $dnum, 0); 
            if ($int == '0') { 
                $loop = false; 
            } 
        } 
        if (count($arr) < $format) 
            $arr = array_pad($arr, $format, $dics[0]); 
 
        return implode('', array_reverse($arr)); 
    } 
 
    public function decodeID($ids) { 
        $dics = $this->dic; 
        $dnum = 36; //进制数 
        //键值交换 
        $dedic = array_flip($dics); 
        //去零 
        $id = ltrim($ids, $dics[0]); 
        //反转 
        $id = strrev($id); 
        $v = 0; 
        for ($i = 0, $j = strlen($id); $i < $j; $i++) { 
            $v = bcadd(bcmul($dedic[$id { 
                $i } 
            ], bcpow($dnum, $i, 0), 0), $v, 0); 
        } 
        return $v; 
    } 
 
} 



<?php
$code = new Code(); 
for($i=1;$i<10000000;$i++){
    $card_no = $code->encodeID($i,4);
}


测试。4位数不够用,最大1679615 == ZZZZ


好的。谢谢。。我看看。。
0
辣条拌鱼翅
辣条拌鱼翅
这是啥需求? 长度加长点这个问题不就很好解决了
返回顶部
顶部