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版本)
原文地址:https://www.cnblogs.com/fanbi/p/9221104.html