ID过滤靓号写法(PHP和Nodejs版本)
2023-09-11 14:18:07 时间
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位数,如果是位数更多,则只需在这个代码上多封装一层,就可以实现几位都可以的靓号过滤。如果用正则表达式来写,代码量会更少,显得更简洁些。
相关文章
- 区别 PHP 的 $_POST、$HTTP_RAW_POST_DATA 和 php://input
- PHP如何自动识别第三方Restful API的内容,自动渲染成 json、xml、html、serialize、csv、php等数据
- 配置php.ini实现PHP文件上传功能
- PHP常量PHP_SAPI与函数php_sapi_name()简介,PHP运行环境检测
- PHP Socket编程 之 php cc攻击代码与防范方法
- PHP Socket编程 之 php中连接tcp服务的三种方式
- PHP 性能优化 - php.ini 配置
- php:PHP解析xml的4种方法
- dns未设置 PHP Warning: file_get_contents():php_network_getaddresses: getaddrinfo failed:
- Window下配置NodeJs环境详解
- [获取行数]php读取大文件提供性能的方法,PHP的stream_get_line函数读取大文件获取文件的行数的方...
- PHP采集库-Snoopy.class.php
- nodejs的划时代意义,以及vue和nodejs的关系
- 基于nodejs的开源博客
- php类库PHP QR Code 二维码
- Relearning PHP (2) – php 的浮点数float
- file not found. nginx php nginx 如何开启解析 PHP 的功能
- PHP-5.4.4 安装 APC 启东php-fpm 提示
- php:在linux上用sudo提升权限(centos 8 / PHP 7.4.2)
- LZW算法PHP实现方法 lzw_decompress php
- php类库PHP QR Code 二维码
- Pre and post exit in ABAP method and Nodejs
- Atitit 提升开发效率 简化设计工具箱 vs 问题诊断 目录 1. 语言类类tool内嵌脚本解释器1 1.1. 脚本语言 php nodejs python1 1.2. Sql1 2. D
- Atitit php pdo的api使用 目录 1.1. PHP PDO简介1 1.2. 若要使用数据库长连接,:PDO::ATTR_PERSISTENT1 2. 其他设置2 2.1. )、P
- Atitit 前端重要概念和趋势总结 大前端 目录 1. 大前端1 2. 三个层面上的大前端1 2.1. 大前端与NodeJS与前后端分离1 2.2. 微信Web1 2.3. React
- nodejs项目的package-lock.json文件的用途
- 使用nodejs对Marketing Cloud的contact主数据进行修改操作
- nodejs项目npm start背后的工作原理
- NodeJs——(11)控制权转移next
- chrome中的base64和nodejs中的base64
- 令人窒息的操作,nodejs面向对象。
- CentOS下yum安装PHP,配置php-fpm服务
- NodeJS+Vue+Element-Ui/Plus+Axios+Vue-router+vuex 详细下载、安装、创建项目、引入