zoukankan      html  css  js  c++  java
  • ID过滤靓号写法(PHP和Nodejs版本)

    1 前言

    例如某APP的用户ID,需要按照一定规则把靓号先存取来,然后慢慢按要求释放靓号

    2 代码

    PHP版本如下:

    function genUserId(){
    
            $id = "";
            $arr = [1,2,3,5,6,7,8,9];
            //var arr2 = [0,1,2,3,5,6,7,8,9];
            $rand_index = rand(0,7);
            $id.=$arr[$rand_index];
    
            for($i = 0; $i < 5; ++$i){
                $id .= rand(0,9);
            }
    
            if(!$this->reserveNumber($id)){
                $flag = $this->isNiceNumber($id);
                if($flag){
                    $this->genUserId();
                }
            }else{
                $this->genUserId();
            }
    
            return $id;
        }
    
        function reserveNumber($numStr){
    
            if(intval($numStr) <= 100100){
                return true;
            }
    
            return false;
        }
    
        function isNiceNumber($numStr){
    // 靓号规则
    // 顺子(正顺和反)6顺、5顺,如:123456或654321
    // 6连、5连、4同、5同、6同
    
    // 其他:AAACCC、ABCEEE、AAACDE、ABCABC、ABAABA、AABBCC
    //AAACCC、AAACDE、ABCEEE、ABCABC、ABAABA、AABBCC、
    
            //转化成整数
            $a0 = (int)$numStr[0];
            $a1 = (int)$numStr[1];
            $a2 = (int)$numStr[2];
            $a3 = (int)$numStr[3];
            $a4 = (int)$numStr[4];
            $a5 = (int)$numStr[5];
    
            //1单
            if($this->isSameNumSeries($a1,$a2,$a3,$a4,$a5)){ ////单+5同,包含6同
                return true;
            }else if($this->isLianNumSeries($a1,$a2,$a3,$a4,$a5)){ //单+5连,包含6连
                return true;
            }
    
    
            //先处理前两个及以上相同的
            if($this->isSameNumSeries($a0,$a1)) { //AABBCC或者AABBAA
                if(($a0 == $a2 + 1 || $a0 == $a2 - 1) && $this->isSameNumSeries($a2,$a3)){
                    if(($a4 == $a2 + 1 || $a4 == $a2 - 1) && $this->isSameNumSeries($a4,$a5)){
                        return true;
                    }
                }else if($this->isSameNumSeries($a2,$a3,$a4,$a5)){ //4同+前面1对
                    if($this->isSameNumSeries($a0,$a1)){
                        return true;
                    }
                }
            }
    
            if($this->isSameNumSeries($a0,$a1,$a2)){ //AAACCC、AAACDE、ABCEEE、ABCABC、ABAABA、AABBCC、100000
                if($this->isSameNumSeries($a3,$a4,$a5)){ //AAACCC
                    return true;
                }else if($this->isLianNumSeries($a3,$a4,$a5)){ //AAACDE
                    return true;
                }else if($this->isSameNumSeries($a0,$a1,$a2,$a3)){ //4同+后面1对
                    if($this->isSameNumSeries($a4,$a5)){
                        return true;
                    }else if($this->isSameNumSeries($a0,$a4)){ //5同+单
                        return true;
                    }
                }
            }else if($this->isLianNumSeries($a0,$a1,$a2)){ //ABCEEE、ABCABC
                if($this->isSameNumSeries($a3,$a4,$a5)){ //ABCEEE
                    return true;
                }else if($this->isSameNumSeries($a0,$a3) && $this->isSameNumSeries($a1,$a4) && $this->isSameNumSeries($a2,$a5)){ //ABCABC
                    return true;
                }else if($this->isLianNumSeries($a0,$a1,$a2,$a3,$a4)){ //5连+单
                    return true;
                }
            }else if($this->isSameNumSeries($a1,$a4)){
                if($this->isSameNumSeries($a0,$a2,$a3,$a5)){ //ABAABA
                    return true;
                }
            }
    
            return false;
    
        }
    
        function isSameNumSeries(){
            $len= func_num_args();
            $flag = false;
            $count = 0;
            for($i = 0; i < $len; $i++){
                if(func_get_arg(i) == func_get_arg(0)){
                    $count++;
                }else{
                    return false;
                }
            }
            if($count == $len){
                $flag = true;
            }
            return $flag;
        }
    
        function isLianNumSeries(){
            $len= func_num_args();
            $flag = false;
            $count = 0;
            $asc = 1;
    
            if(!(func_get_arg(0) == func_get_arg($len-1) + ($len-1) || func_get_arg(0) == func_get_arg($len-1) - ($len-1))){
                return false;
            }
    
            if(func_get_arg(0) > func_get_arg($len-1)){
                $asc = -1;
            }
    
            for($i = 1; $i < $len; $i++){
                if(func_get_arg($i-1) + $asc == func_get_arg($i)){ //升序
                    $count++;
                }
            }
    
            if($count == $len-1){
                $flag = true;
            }
            return $flag;
        }
    

    Nodejs版本如下:

    function genUserId(){
    // ID位数:6位数。
    // 默认不带四,第一位不能是0,即“100588”;
    // 保证唯一性、无序性;
    // 保证ID运算速度快,考虑到6位需要运算和去重;
    // a.做ID池子,随机打乱,然后分配ID;
    // b.做拼接,前三位+后三位,然后依次做去重,有两两重复则重新生成;
    // 用户ID与推广ID一致;
        var id = "";
        var arr = [1,2,3,5,6,7,8,9];
        //var arr2 = [0,1,2,3,5,6,7,8,9];
        var rand_index = Math.floor(Math.random()*arr.length);
        id+=arr[rand_index];
    
        for(var i = 0; i < 5; ++i){
            id += Math.floor(Math.random()*10);
        }
    
        
        if(!reserveNumber(id)){
            var flag = isNiceNumber(id);
            if(flag){
                 genUserId();
             }
        }else{
            genUserId();
        }
        
        console.log("gen userid="+id);
        return id;
    }
    
    function reserveNumber(numStr){
        if(parseInt(numStr) <= 100100){
            return true;
        }
        return false;
    }
    
    function isNiceNumber(numStr){
    // 靓号规则
    // 顺子(正顺和反)6顺、5顺,如:123456或654321
    // 6连、5连、4同、5同、6同
    
    // 其他:AAACCC、ABCEEE、AAACDE、ABCABC、ABAABA、AABBCC
    //AAACCC、AAACDE、ABCEEE、ABCABC、ABAABA、AABBCC
    
        //转化成整数
        var a0 = numStr[0] - 0;
        var a1 = numStr[1] - 0;
        var a2 = numStr[2] - 0;
        var a3 = numStr[3] - 0;
        var a4 = numStr[4] - 0;
        var a5 = numStr[5] - 0;
    
        //1单
        if(isSameNumSeries(a1,a2,a3,a4,a5)){ ////单+5同,包含6同
            return true;
        }else if(isLianNumSeries(a1,a2,a3,a4,a5)){ //单+5连,包含6连
            return true;
        }
    
    
        //先处理前两个及以上相同的
        if(isSameNumSeries(a0,a1)) { //AABBCC或者AABBAA
            if((a0 == a2 + 1 || a0 == a2 - 1) && isSameNumSeries(a2,a3)){
                if((a4 == a2 + 1 || a4 == a2 - 1) && isSameNumSeries(a4,a5)){
                    return true;
                }
            }else if(isSameNumSeries(a2,a3,a4,a5)){ //4同+前面1对
                if(isSameNumSeries(a0,a1)){
                    return true;
                }
            }
        }
    
        if(isSameNumSeries(a0,a1,a2)){ //AAACCC、AAACDE、ABCEEE、ABCABC、ABAABA、AABBCC
            if(isSameNumSeries(a3,a4,a5)){ //AAACCC
                return true;
            }else if(isLianNumSeries(a3,a4,a5)){ //AAACDE
                return true;
            }else if(isSameNumSeries(a0,a1,a2,a3)){ //4同+后面1对
                if(isSameNumSeries(a4,a5)){
                    return true;
                }else if(isSameNumSeries(a0,a4)){ //5同+单
                    return true;
                }/*else if(isSameNumSeries(a0,a1,a2,a3,a4,a5)){ //6同
    		        return true;
    		    }*/
            }
        }else if(isLianNumSeries(a0,a1,a2)){ //ABCEEE、ABCABC
            if(isSameNumSeries(a3,a4,a5)){ //ABCEEE
                return true;
            }else if(isSameNumSeries(a0,a3) && isSameNumSeries(a1,a4) && isSameNumSeries(a2,a5)){ //ABCABC
                return true;
            }else if(isLianNumSeries(a0,a1,a2,a3,a4)){ //5连+单
                return true;
            }/*else if(isLianNumSeries(a0,a1,a2,a3,a4,a5)){ //6连
                return true;
        	}*/
        }else if(isSameNumSeries(a1,a4)){
            if(isSameNumSeries(a0,a2,a3,a5)){ //ABAABA
                return true;
            }
        }
    
        return false;
    
    }
    
    function isSameNumSeries(){
        var len= arguments.length;
        var flag = false;
        var count = 0;
        for(var i = 0; i < len; i++){
            if(arguments[i] == arguments[0]){
                count++;
            }else{
                return false;
            }
        }
        if(count == len){
            flag = true;
        }
        return flag;
    }
    
    function isLianNumSeries(){
        var len= arguments.length;
        var flag = false;
        var count = 0;
        var asc = 1;
    
        if(!(arguments[0] == arguments[len-1] + (len-1) || arguments[0] == arguments[len-1] - (len-1))){
            return false;
        }
    
        if(arguments[0] > arguments[len-1]){
            asc = -1;
        }
    
        for(var i = 1; i < len; i++){
            if(arguments[i-1] + asc == arguments[i]){ //升序
                count++;
            }
        }
    
        if(count == len-1){
            flag = true;
        }
        return flag;
    }
    

    3 小结

    上述代码是默认ID是6位数,如果是位数更多,则只需在这个代码上多封装一层,就可以实现几位都可以的靓号过滤。如果用正则表达式来写,代码量会更少,显得更简洁些。  

      

  • 相关阅读:
    eclipse快速给表达式生成对应变量的快捷键
    java截取字符串中的最后几个字符
    javascript删除数组元素的7个方法
    java构建树形列表(带children属性)
    elementui树表修改子节点不能实时更新的解决办法
    css3的user-select属性设置文本内容能否被选择
    javascript中for-in和for-of的区别
    计算机等级考试改革
    SQL分组查询
    Windows 8 快捷键
  • 原文地址:https://www.cnblogs.com/fanbi/p/9221104.html
Copyright © 2011-2022 走看看