1. 程式人生 > >ID過濾靚號寫法(PHP和Nodejs版本)

ID過濾靚號寫法(PHP和Nodejs版本)

log aabb CA tro 運算 代碼 ice for brush

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位數,如果是位數更多,則只需在這個代碼上多封裝一層,就可以實現幾位都可以的靚號過濾。如果用正則表達式來寫,代碼量會更少,顯得更簡潔些。  

  

ID過濾靚號寫法(PHP和Nodejs版本)