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位数,如果是位数更多,则只需在这个代码上多封装一层,就可以实现几位都可以的靓号过滤。如果用正则表达式来写,代码量会更少,显得更简洁些。
ID过滤靓号写法(PHP和Nodejs版本)的更多相关文章
- jqGrid根据ID获取行号
根据行号获取ID $('#grid').getCell(rownumber,'id') 根据ID获取行号 $('#' + rowid)[0].rowIndex
- 靓号正则表达式(前后向查找等) 和 apache正则包使用
一般公司在开发一类对的号码时,会预留一些号码给以后升级的会员使用,比如旺旺靓号,QQ号等,采用正则表达式实现较好,通过规则引擎的后台页面做成实时可配置的也是不错的选择. 一. 一般会有如下的正则需求 ...
- 免费申请 QQ 免费靓号
打开网址:https://ssl.zc.qq.com/v3/index-chs.html?type=3 说明:靓号一般分为 9位靓号 or 带有寓意的号码 激活规则:获取的"靓号" ...
- QQ靓号资料空白且空间开通教程
QQ靓号资料空白且空间开通教程 首先你需要两个QQ号第一个是普通QQ号第二个是去这个官方网站注册一个QQ免费靓号https://ssl.zc.qq.com/v3/index-chs.html?type ...
- 分布式ID(CosId)之号段链模式性能(1.2亿/s)解析
分布式ID(CosId)之号段链模式性能(1.2亿/s)解析 上一篇文章<分布式ID生成器(CosId)设计与实现>我们已经简单讨论过CosId的设计与实现全貌. 但是有很多同学有一些疑问 ...
- 微信JS-SDK“分享信息设置”API及数字签名生成方法(NodeJS版本)
原文:微信JS-SDK"分享信息设置"API及数字签名生成方法(NodeJS版本) 先上测试地址以示成功: 用微信打开下面地址测试 http://game.4gshu.com/de ...
- window nodejs 版本切换 nvmw
参考文档:https://cnodejs.org/topic/5338c5db7cbade005b023c98 nvmw 下载到本地 git clone https://github.com/hako ...
- 如何升级nodejs版本
直接下载最新版安装即可,例如我本地的nodejs版本为: y@y:untitled$ node -v v0.10.33 当前node官网最新版本为:Current Version: v0.12.2 下 ...
- 使用nvm来管理nodejs版本
nvm 是 Mac 下的 node 管理工具,有点类似管理 Ruby 的 rvm,如果是需要管理 Windows 下的 node,官方推荐是使用 nvmw 或 nvm-windows .nvm主要用来 ...
随机推荐
- git步骤
1.New一个Repositories 2.拿到这个仓库的URL 3.git clone https://github.com/zhuobo/new.git 4.进入到clone下来的文件夹,然后gi ...
- HTTP status constants
HTTP status constants value = ngx.HTTP_CONTINUE (100) (first added in the v0.9.20 release) value = n ...
- Linq中Sum和Group的使用
].AsEnumerable() group c by c.Field<int>("Name") into s select new { ID = s.Select(m ...
- AutoPostBack
AutoPostBack 属性用于设置或返回当用户在 TextBox 控件中按 Enter 或 Tab 键时,是否发生自动回传到服务器的操作. 如果把该属性设置为 TRUE,则启用自动回传,否则为 F ...
- CorelDrawX8安装时提示已安装另一个版本
(1)首先卸载VIsualC++ 2015 运行库. (2)如果有VisualC++ 2017运行库,卸载VisualC++2017运行库,即可.
- Visual Studio 2013 更新 NuGet 包管理器
Ø 前言 使用 Visual Studio 中的 NuGet 包管理器下载程序时,有时可能出现类似的错误:. 5. 在"联机"选项中搜索"NuGet",选 ...
- 【U3d】Tiled2Unity 使用Tips
Tiled编辑完地图后借Tiled2Unity导入Unity. 使用T2U时遇到点麻烦,打开T2U界面显示如下,注意上方黄底文字,需要在Tiled中添加命令行才能使用T2U. 在Tiled工具栏点击( ...
- Docker 操作记录
Docker docker info 查看信息 docker 更改镜像目录 方式:1.配置文件修改 # cat /etc/sysconfig/docker |grep -v ^# |grep -v ^ ...
- FlexPaper 2.3.6 远程命令执行漏洞 附Exp
影响版本:小于FlexPaper 2.3.6的所有版本 FlexPaper (https://www.flowpaper.com) 是一个开源项目,遵循GPL协议,在互联网上非常流行.它为web客户端 ...
- jsonp实现下拉搜索
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...