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主要用来 ...
随机推荐
- SecureCRT通过拷贝配置文件登陆
不知道是不是SecureCRT有问题,有时候会出现配置丢失的情况,而自己又找不到密码了,于是从同事拷贝配置文件,发现可以成功复制服务器登陆信息 1.option -> global option ...
- ueditor 百度编辑器 粘贴的table表格样式边线
粘贴html的table表格会有间隔大,黑色边线,可以在: ueditor.all.js 里 找到以下处,修改里面的样式即可 me.ready(function () { utils.cssRule( ...
- Nginx负载均衡session会话保持方法
负载均衡时,为了保证同一用户session会被分配到同一台服务器上,可以使用以下方法: 1.使用cookie 将用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在 ...
- luogu 1966 火柴排队 离散化+逆序对
题意:找到最小改变对数使a数组的第i大和b数组的第i大相等 则先将a,b,数组编号再排序,则数组显示的就是排名第i的数的编号 再关键一步:c[a[i].id]=b[i].id 实质上就是新建一个数组, ...
- HTML字体自动换行第二行缩进一格
p {text-indent: -2em; margin-left: 2em;}设置text-indent: -2em;以后p标签中第一行文字向左偏移,这样第二行开始的文字就等于缩进了,但是这样设置会 ...
- 牛客寒假训练营3 B 处女座的比赛资格(拓扑排序+最短路)
题目链接 这个题,一眼看上去就是最短路的题,边权有负环显然不能用dij,然后出题人又卡了spfa,,那怎么办的想点办法啊,好像还有一个拓扑排序可以求最短路吧,这时候正解就已经得到了,就是拓扑排序求最短 ...
- VMWare14 安装Mac OS系统(图解)
★ 背景 瞅了瞅自己干瘪的钱包,没忍心入手期待已久的 macPro,只好在虚拟机里玩一下 mac好了,等以后钱包傲气的时候再来个真实的. 安装环境: windows10 VMWare14.2 一.准备 ...
- webpack指定第三方模块的查找路径
通常我们会使用一些地方模块在我们的项目中,比如bootstrap import 'bootstrap' 导入的bootstrap默认会查找当前目录的node_modules文件,但是如果这个文件没有, ...
- linux atoi
atoi 只能针对字符串为数字, 对字符串为十六进制.八进制的不能进行转化
- 用FileZilla链接Linux服务器
这里以CentOS举例 用SSH文件传输端口,默认为22端口,用netstat -antulp | grep ssh命令查看!