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版本)的更多相关文章

  1. jqGrid根据ID获取行号

    根据行号获取ID $('#grid').getCell(rownumber,'id') 根据ID获取行号 $('#' + rowid)[0].rowIndex

  2. 靓号正则表达式(前后向查找等) 和 apache正则包使用

    一般公司在开发一类对的号码时,会预留一些号码给以后升级的会员使用,比如旺旺靓号,QQ号等,采用正则表达式实现较好,通过规则引擎的后台页面做成实时可配置的也是不错的选择. 一. 一般会有如下的正则需求 ...

  3. 免费申请 QQ 免费靓号

    打开网址:https://ssl.zc.qq.com/v3/index-chs.html?type=3 说明:靓号一般分为 9位靓号 or 带有寓意的号码 激活规则:获取的"靓号" ...

  4. QQ靓号资料空白且空间开通教程

    QQ靓号资料空白且空间开通教程 首先你需要两个QQ号第一个是普通QQ号第二个是去这个官方网站注册一个QQ免费靓号https://ssl.zc.qq.com/v3/index-chs.html?type ...

  5. 分布式ID(CosId)之号段链模式性能(1.2亿/s)解析

    分布式ID(CosId)之号段链模式性能(1.2亿/s)解析 上一篇文章<分布式ID生成器(CosId)设计与实现>我们已经简单讨论过CosId的设计与实现全貌. 但是有很多同学有一些疑问 ...

  6. 微信JS-SDK“分享信息设置”API及数字签名生成方法(NodeJS版本)

    原文:微信JS-SDK"分享信息设置"API及数字签名生成方法(NodeJS版本) 先上测试地址以示成功: 用微信打开下面地址测试 http://game.4gshu.com/de ...

  7. window nodejs 版本切换 nvmw

    参考文档:https://cnodejs.org/topic/5338c5db7cbade005b023c98 nvmw 下载到本地 git clone https://github.com/hako ...

  8. 如何升级nodejs版本

    直接下载最新版安装即可,例如我本地的nodejs版本为: y@y:untitled$ node -v v0.10.33 当前node官网最新版本为:Current Version: v0.12.2 下 ...

  9. 使用nvm来管理nodejs版本

    nvm 是 Mac 下的 node 管理工具,有点类似管理 Ruby 的 rvm,如果是需要管理 Windows 下的 node,官方推荐是使用 nvmw 或 nvm-windows .nvm主要用来 ...

随机推荐

  1. 自学python 6.

    内容:id() is == 编码 解码1.好声音选秀比赛评委在打分的时候可以进行输入. 假设有10个评委.让10个评委进行打分, 要求, 分数必须大于5分, 小于10分.count = 1while ...

  2. [Android] Android 让UI控件固定于底部的几种方法

    Android 让UI控件固定于底部的几种方法1.采用linearlayout布局:android:layout_height="0dp" <!-- 这里不能设置fill_p ...

  3. oracle java连接配置

    oracle数据库连接使用ojdbc驱动.使用tomcat-jdbc连接池. pom.xml: <!-- tomcat jdbc --> <dependency> <gr ...

  4. HTML 实例学习(基础)

    1.HTML <html> 标签 注意:对于中文网页需要使用 <meta charset="utf-8"> 声明编码,否则会出现乱码.有些浏览器会设置 GB ...

  5. XXE攻防

    一.XML基础知识 XML用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.XML文档结构包括XML声明.DTD文档类型定义(可 ...

  6. 20155324 2016-2017-2 《Java程序设计》第8周学习总结

    20155324 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 通用API -** 日志API** 1.~java.util.logging~包提供了日志功 ...

  7. Eclipse下生成/编辑Java类图或时序图(UML)[转载]

    一 引用文章 1.[eclipse下生成Java类图和时序图,生成UML图(更完整版)](https://blog.csdn.net/guomainet309/article/details/5302 ...

  8. 安装LDAP用户认证

    LDAP伺服器设定 1.安装 openldap-servers yum -y install openldap openldap-devel openldap-servers 2.建立 LDAP 密码 ...

  9. Webstorm快捷操作

    设置和使用技巧:前端工具开发利器webstrom专篇...更新中 选中行上下移:cl+shift+上下箭头 展示文件结构图:view-tool_window-structure.具体的图标含义 生成注 ...

  10. linux 基础笔记本

    ubuntu 端口使用查看 查看已经连接的服务端口(ESTABLISHED) netstat -a 查看所有的服务端口(LISTEN,ESTABLISHED) netstat -ap 查看指定端口,可 ...