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位数,如果是位数更多,则只需在这个代码上多封装一层,就可以实现几位都可以的靓号过滤。如果用正则表达式来写,代码量会更少,显得更简洁些。  

  

原文地址:https://www.cnblogs.com/fanbi/p/9221104.html

时间: 2024-12-22 11:46:45

ID过滤靓号写法(PHP和Nodejs版本)的相关文章

正则表达式判断手机号码靓号类型

很多网站需要将好的会员号留着,或用于日后的盈利.实现方法不是本文讨论范围,本文仅列出用于检测靓号类型的一些正则. 靓号检测:主要可以检测连号(正连 12345.倒连65432).AABB号.手机号码.日期号(生日号.年度号).ABBCABB号,3位以上重复号.更多类型号码检测可以根据以下表达式改造. ' 匹配6位顺增 regex.Pattern = "(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){5}\d&q

手机靓号筛选——正则表达式

AAAA: (1\d{2})\d{4}([\d])\2{3}AAA: (1\d{2})\d{5}([\d])\2{2}ABCD: (1\d{2})\d{4}(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){3}\dDCBA: (1\d{2})\d{4}(?:9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){3}\dABCABC: (1\

JS正则手机靓号处理AB ABAB AABB

靓号检测:主要可以检测连号(正连 12345.倒连65432).AABB号.手机号码.日期号(生日号.年度号).ABBCABB号,3位以上重复号. 更多类型号码检测可以根据以下表达式改造. 1.匹配6位顺增 (?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){5}\d 2.匹配6位顺降 (?:9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)

短位邮箱靓号注册, VIP邮箱靓号如何买断?

邮箱靓号具备实用.易记.炫酷.个性等特征,通常为顺子号.豹子号或3-6位的短账号组成, 好的邮箱靓号不仅彰显高端大气的独特气质,更可拓宽个人运势.关于短位邮箱靓号如何购买,跟随小编来了解下. 如何购买“邮箱靓号” 前往TOM VIP邮箱官网—点击“立即注册” 对比邮箱套餐 商务精英型支持5位短靓号.商务黄金版支持4位短靓号.商务白金版支持3位短靓号,不同套餐的功能及赠送福利有差异,请仔细对比.下面,重点来啦~ 选定需要的邮箱账号(支持纯字母,字母+数字组合账号).专业客服人员可为你精心匹配套餐,

靓号分销平台

1.手机页面 2.管理后台 3.浏览网址 http://hmk.lywenkai.com/WeChatManage/Liang/Index?organizeId=2bc55c43-2f3e-4895-9729-90911a684c83 卖手机靓号的老板可以关注并加盟该平台 优势: 1.所有靓号的实时更新! 2.分享自己的靓号商城即可赚钱! 3.后台功能强大,可以批量上传号码! 4.无限下级加盟帮你卖靓号! 欢迎致电:17115055777 原文地址:https://www.cnblogs.com

nodejs版本问题

简单写一下今天的历程,因为开发微信公众号用到nodejs,在运行的时候发现本地系统nodejs版本过低,由于之前发现版本过低,打算用覆盖的方法去解决 ,就安装了新的版本,结果发现不仅覆盖失败还出现了版本共存的问题,由于一时不用node,就没有理会,今天用到了发现怎么都解决不了,尝试网上搜到的方法安装模块n来管理node版本,注意这里的模块n是只有在linux上才可以使用,mac上是nvm,Windows上照着网上说的使用nvm-windows,结果也是系统不支持,最后找不到别的方法,就手动删除了

使用nvm来管理nodejs版本

nvm 是 Mac 下的 node 管理工具,有点类似管理 Ruby 的 rvm,如果是需要管理 Windows 下的 node,官方推荐是使用 nvmw 或 nvm-windows .nvm主要用来在不同的nodejs版本中切换,以便当node出新版本时,可以使用一些新的特性 nvm安装 git clone https://github.com/creationix/nvm.git ~/.nvm 然后打开 ~/.bashrc , 在其中添加: source ~/.nvm/nvm.sh 重新ss

如何升级nodejs版本

直接下载最新版安装即可,例如我本地的nodejs版本为: [email protected]:untitled$ node -v v0.10.33 当前node官网最新版本为:Current Version: v0.12.2 下载源码:https://nodejs.org/download/ 进行安装:node-v0.12.2.tar.gz 即可: [email protected]:untitled$ node -v v0.12.2 [email protected]:untitled$ 安装

微信公众号开发笔记1(nodejs开发的)

本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有自己的服务器与微信服务器进行认证通过后,才能与他交流.如何进行认证? 1. 接口认证 接口的认证是token验证,微信服务器会发送一个get请求给我们在公众号配置的接口,如http://xxxx/weixin/api ,这个请求带了如下参数 然后,微信规定我们 1)将token.timestamp.