1 前言

例如某APP的用户ID,需要按照一定规则把靓号先存取来,然后慢慢按要求释放靓号

2 代码

PHP版本如下:

  1. function genUserId(){
  2.  
  3. $id = "";
  4. $arr = [1,2,3,5,6,7,8,9];
  5. //var arr2 = [0,1,2,3,5,6,7,8,9];
  6. $rand_index = rand(0,7);
  7. $id.=$arr[$rand_index];
  8.  
  9. for($i = 0; $i < 5; ++$i){
  10. $id .= rand(0,9);
  11. }
  12.  
  13. if(!$this->reserveNumber($id)){
  14. $flag = $this->isNiceNumber($id);
  15. if($flag){
  16. $this->genUserId();
  17. }
  18. }else{
  19. $this->genUserId();
  20. }
  21.  
  22. return $id;
  23. }
  24.  
  25. function reserveNumber($numStr){
  26.  
  27. if(intval($numStr) <= 100100){
  28. return true;
  29. }
  30.  
  31. return false;
  32. }
  33.  
  34. function isNiceNumber($numStr){
  35. // 靓号规则
  36. // 顺子(正顺和反)6顺、5顺,如:123456或654321
  37. // 6连、5连、4同、5同、6同
  38.  
  39. // 其他:AAACCC、ABCEEE、AAACDE、ABCABC、ABAABA、AABBCC
  40. //AAACCC、AAACDE、ABCEEE、ABCABC、ABAABA、AABBCC、
  41.  
  42. //转化成整数
  43. $a0 = (int)$numStr[0];
  44. $a1 = (int)$numStr[1];
  45. $a2 = (int)$numStr[2];
  46. $a3 = (int)$numStr[3];
  47. $a4 = (int)$numStr[4];
  48. $a5 = (int)$numStr[5];
  49.  
  50. //1单
  51. if($this->isSameNumSeries($a1,$a2,$a3,$a4,$a5)){ ////单+5同,包含6同
  52. return true;
  53. }else if($this->isLianNumSeries($a1,$a2,$a3,$a4,$a5)){ //单+5连,包含6连
  54. return true;
  55. }
  56.  
  57. //先处理前两个及以上相同的
  58. if($this->isSameNumSeries($a0,$a1)) { //AABBCC或者AABBAA
  59. if(($a0 == $a2 + 1 || $a0 == $a2 - 1) && $this->isSameNumSeries($a2,$a3)){
  60. if(($a4 == $a2 + 1 || $a4 == $a2 - 1) && $this->isSameNumSeries($a4,$a5)){
  61. return true;
  62. }
  63. }else if($this->isSameNumSeries($a2,$a3,$a4,$a5)){ //4同+前面1对
  64. if($this->isSameNumSeries($a0,$a1)){
  65. return true;
  66. }
  67. }
  68. }
  69.  
  70. if($this->isSameNumSeries($a0,$a1,$a2)){ //AAACCC、AAACDE、ABCEEE、ABCABC、ABAABA、AABBCC、100000
  71. if($this->isSameNumSeries($a3,$a4,$a5)){ //AAACCC
  72. return true;
  73. }else if($this->isLianNumSeries($a3,$a4,$a5)){ //AAACDE
  74. return true;
  75. }else if($this->isSameNumSeries($a0,$a1,$a2,$a3)){ //4同+后面1对
  76. if($this->isSameNumSeries($a4,$a5)){
  77. return true;
  78. }else if($this->isSameNumSeries($a0,$a4)){ //5同+单
  79. return true;
  80. }
  81. }
  82. }else if($this->isLianNumSeries($a0,$a1,$a2)){ //ABCEEE、ABCABC
  83. if($this->isSameNumSeries($a3,$a4,$a5)){ //ABCEEE
  84. return true;
  85. }else if($this->isSameNumSeries($a0,$a3) && $this->isSameNumSeries($a1,$a4) && $this->isSameNumSeries($a2,$a5)){ //ABCABC
  86. return true;
  87. }else if($this->isLianNumSeries($a0,$a1,$a2,$a3,$a4)){ //5连+单
  88. return true;
  89. }
  90. }else if($this->isSameNumSeries($a1,$a4)){
  91. if($this->isSameNumSeries($a0,$a2,$a3,$a5)){ //ABAABA
  92. return true;
  93. }
  94. }
  95.  
  96. return false;
  97.  
  98. }
  99.  
  100. function isSameNumSeries(){
  101. $len= func_num_args();
  102. $flag = false;
  103. $count = 0;
  104. for($i = 0; i < $len; $i++){
  105. if(func_get_arg(i) == func_get_arg(0)){
  106. $count++;
  107. }else{
  108. return false;
  109. }
  110. }
  111. if($count == $len){
  112. $flag = true;
  113. }
  114. return $flag;
  115. }
  116.  
  117. function isLianNumSeries(){
  118. $len= func_num_args();
  119. $flag = false;
  120. $count = 0;
  121. $asc = 1;
  122.  
  123. if(!(func_get_arg(0) == func_get_arg($len-1) + ($len-1) || func_get_arg(0) == func_get_arg($len-1) - ($len-1))){
  124. return false;
  125. }
  126.  
  127. if(func_get_arg(0) > func_get_arg($len-1)){
  128. $asc = -1;
  129. }
  130.  
  131. for($i = 1; $i < $len; $i++){
  132. if(func_get_arg($i-1) + $asc == func_get_arg($i)){ //升序
  133. $count++;
  134. }
  135. }
  136.  
  137. if($count == $len-1){
  138. $flag = true;
  139. }
  140. return $flag;
  141. }

Nodejs版本如下:

  1. function genUserId(){
  2. // ID位数:6位数。
  3. // 默认不带四,第一位不能是0,即“100588”;
  4. // 保证唯一性、无序性;
  5. // 保证ID运算速度快,考虑到6位需要运算和去重;
  6. // a.做ID池子,随机打乱,然后分配ID;
  7. // b.做拼接,前三位+后三位,然后依次做去重,有两两重复则重新生成;
  8. // 用户ID与推广ID一致;
  9. var id = "";
  10. var arr = [1,2,3,5,6,7,8,9];
  11. //var arr2 = [0,1,2,3,5,6,7,8,9];
  12. var rand_index = Math.floor(Math.random()*arr.length);
  13. id+=arr[rand_index];
  14.  
  15. for(var i = 0; i < 5; ++i){
  16. id += Math.floor(Math.random()*10);
  17. }
  18.  
  19. if(!reserveNumber(id)){
  20. var flag = isNiceNumber(id);
  21. if(flag){
  22. genUserId();
  23. }
  24. }else{
  25. genUserId();
  26. }
  27.  
  28. console.log("gen userid="+id);
  29. return id;
  30. }
  31.  
  32. function reserveNumber(numStr){
  33. if(parseInt(numStr) <= 100100){
  34. return true;
  35. }
  36. return false;
  37. }
  38.  
  39. function isNiceNumber(numStr){
  40. // 靓号规则
  41. // 顺子(正顺和反)6顺、5顺,如:123456或654321
  42. // 6连、5连、4同、5同、6同
  43.  
  44. // 其他:AAACCC、ABCEEE、AAACDE、ABCABC、ABAABA、AABBCC
  45. //AAACCC、AAACDE、ABCEEE、ABCABC、ABAABA、AABBCC
  46.  
  47. //转化成整数
  48. var a0 = numStr[0] - 0;
  49. var a1 = numStr[1] - 0;
  50. var a2 = numStr[2] - 0;
  51. var a3 = numStr[3] - 0;
  52. var a4 = numStr[4] - 0;
  53. var a5 = numStr[5] - 0;
  54.  
  55. //1单
  56. if(isSameNumSeries(a1,a2,a3,a4,a5)){ ////单+5同,包含6同
  57. return true;
  58. }else if(isLianNumSeries(a1,a2,a3,a4,a5)){ //单+5连,包含6连
  59. return true;
  60. }
  61.  
  62. //先处理前两个及以上相同的
  63. if(isSameNumSeries(a0,a1)) { //AABBCC或者AABBAA
  64. if((a0 == a2 + 1 || a0 == a2 - 1) && isSameNumSeries(a2,a3)){
  65. if((a4 == a2 + 1 || a4 == a2 - 1) && isSameNumSeries(a4,a5)){
  66. return true;
  67. }
  68. }else if(isSameNumSeries(a2,a3,a4,a5)){ //4同+前面1对
  69. if(isSameNumSeries(a0,a1)){
  70. return true;
  71. }
  72. }
  73. }
  74.  
  75. if(isSameNumSeries(a0,a1,a2)){ //AAACCC、AAACDE、ABCEEE、ABCABC、ABAABA、AABBCC
  76. if(isSameNumSeries(a3,a4,a5)){ //AAACCC
  77. return true;
  78. }else if(isLianNumSeries(a3,a4,a5)){ //AAACDE
  79. return true;
  80. }else if(isSameNumSeries(a0,a1,a2,a3)){ //4同+后面1对
  81. if(isSameNumSeries(a4,a5)){
  82. return true;
  83. }else if(isSameNumSeries(a0,a4)){ //5同+单
  84. return true;
  85. }/*else if(isSameNumSeries(a0,a1,a2,a3,a4,a5)){ //6同
  86. return true;
  87. }*/
  88. }
  89. }else if(isLianNumSeries(a0,a1,a2)){ //ABCEEE、ABCABC
  90. if(isSameNumSeries(a3,a4,a5)){ //ABCEEE
  91. return true;
  92. }else if(isSameNumSeries(a0,a3) && isSameNumSeries(a1,a4) && isSameNumSeries(a2,a5)){ //ABCABC
  93. return true;
  94. }else if(isLianNumSeries(a0,a1,a2,a3,a4)){ //5连+单
  95. return true;
  96. }/*else if(isLianNumSeries(a0,a1,a2,a3,a4,a5)){ //6连
  97. return true;
  98. }*/
  99. }else if(isSameNumSeries(a1,a4)){
  100. if(isSameNumSeries(a0,a2,a3,a5)){ //ABAABA
  101. return true;
  102. }
  103. }
  104.  
  105. return false;
  106.  
  107. }
  108.  
  109. function isSameNumSeries(){
  110. var len= arguments.length;
  111. var flag = false;
  112. var count = 0;
  113. for(var i = 0; i < len; i++){
  114. if(arguments[i] == arguments[0]){
  115. count++;
  116. }else{
  117. return false;
  118. }
  119. }
  120. if(count == len){
  121. flag = true;
  122. }
  123. return flag;
  124. }
  125.  
  126. function isLianNumSeries(){
  127. var len= arguments.length;
  128. var flag = false;
  129. var count = 0;
  130. var asc = 1;
  131.  
  132. if(!(arguments[0] == arguments[len-1] + (len-1) || arguments[0] == arguments[len-1] - (len-1))){
  133. return false;
  134. }
  135.  
  136. if(arguments[0] > arguments[len-1]){
  137. asc = -1;
  138. }
  139.  
  140. for(var i = 1; i < len; i++){
  141. if(arguments[i-1] + asc == arguments[i]){ //升序
  142. count++;
  143. }
  144. }
  145.  
  146. if(count == len-1){
  147. flag = true;
  148. }
  149. return flag;
  150. }

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. git步骤

    1.New一个Repositories 2.拿到这个仓库的URL 3.git clone https://github.com/zhuobo/new.git 4.进入到clone下来的文件夹,然后gi ...

  2. HTTP status constants

    HTTP status constants value = ngx.HTTP_CONTINUE (100) (first added in the v0.9.20 release) value = n ...

  3. Linq中Sum和Group的使用

    ].AsEnumerable() group c by c.Field<int>("Name") into s select new { ID = s.Select(m ...

  4. AutoPostBack

    AutoPostBack 属性用于设置或返回当用户在 TextBox 控件中按 Enter 或 Tab 键时,是否发生自动回传到服务器的操作. 如果把该属性设置为 TRUE,则启用自动回传,否则为 F ...

  5. CorelDrawX8安装时提示已安装另一个版本

    (1)首先卸载VIsualC++ 2015 运行库. (2)如果有VisualC++ 2017运行库,卸载VisualC++2017运行库,即可.

  6. Visual Studio 2013 更新 NuGet 包管理器

    Ø  前言 使用 Visual Studio 中的 NuGet 包管理器下载程序时,有时可能出现类似的错误:. 5.   在"联机"选项中搜索"NuGet",选 ...

  7. 【U3d】Tiled2Unity 使用Tips

    Tiled编辑完地图后借Tiled2Unity导入Unity. 使用T2U时遇到点麻烦,打开T2U界面显示如下,注意上方黄底文字,需要在Tiled中添加命令行才能使用T2U. 在Tiled工具栏点击( ...

  8. Docker 操作记录

    Docker docker info 查看信息 docker 更改镜像目录 方式:1.配置文件修改 # cat /etc/sysconfig/docker |grep -v ^# |grep -v ^ ...

  9. FlexPaper 2.3.6 远程命令执行漏洞 附Exp

    影响版本:小于FlexPaper 2.3.6的所有版本 FlexPaper (https://www.flowpaper.com) 是一个开源项目,遵循GPL协议,在互联网上非常流行.它为web客户端 ...

  10. jsonp实现下拉搜索

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...