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 4.

    1.li = ["alex","tom","mike","god","merffy"](1)a = ...

  2. MySQL随记(二)

    第一范式(1NF First Normal Format): 1. 列具有原子性(atomic) 原子(atom)是物质的最小单元, 它不能被再分割为更小的元素. 2. 表具有主键(Primary K ...

  3. php与java通用AES加密解密算法

    AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的 ...

  4. 【LDAP】LDAP注入漏洞与防御

    0x01 前言 前两天爆了一个LDAP漏洞,据说存在了8年现在才被发现,感概一下,不知这8年来有多少站被搞了... 想着复现这个漏洞,就先复习一下LDAP注入的相关知识吧,差了很多资料,记一下笔记. ...

  5. Log4j2 快速开始

    1.配置 默认 Log4j2可以将自己配置为记录错误及更高级别日志,并将消息记录到控制台中. [显示配置]1.检测log4j.configurationFile系统属性,如果属性存在,就从指定文件加载 ...

  6. 第28月第3天 c语言读写文件

    1. int ConfigIniFile::OpenFile( const char* szFileName ) { FILE *fp; size_t nLen; int nRet; CloseFil ...

  7. IIS7配置Gzip压缩

    II7中自带了gzip功能,理论上应该比ii6配置起来应该简单一点,但是容易出的问题比较多.有的II7配置web服务器角色的时候可能没有安装启用动态内容压缩,所以这个钩子是灰色的,需要再次安装. 如图 ...

  8. git 配置 BeyondCompare

    安装 Beyond Compare 4 配置 git git config --global merge.tool bc3 git config --global mergetool.bc3.path ...

  9. javascript常用函数封装——运动、cookie、ajax、获取行内样式兼容写法、拖拽

    运动.cookie.ajax.获取行内样式兼容写法.拖拽封装大合集. //url,data,type,timeout,success,error function ajax(options){ //- ...

  10. 20165234 《Java程序设计》第七周学习总结

    第七周学习总结 教材内容学习 第十一章 JDBC与MySQL数据库 连接数据库: 1. 下载JDBC-MySQL数据库驱动 2. 加载JDBC-MySQL数据库驱动 3. 连接数据库 条件与排序查询: ...