php mysql 预留靓号_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位数,如果是位数更多,则只需在这个代码上多封装一层,就可以实现几位都可以的靓号过滤。如果用正则表达式来写,代码量会更少,显得更简洁些。
php mysql 预留靓号_ID过滤靓号写法(PHP和Nodejs版本)相关推荐
- php靓号实现逻辑,ID过滤靓号写法(PHP和Nodejs版本)
1 前言 例如某APP的用户ID,需要按照一定规则把靓号先存取来,然后慢慢按要求释放靓号 2 代码 PHP版本如下: function genUserId(){ $id = ""; ...
- mysql 过滤单引号_python实现mysql的单引号字符串过滤方法
本文实例讲述了python实现mysql的单引号字符串过滤方法.分享给大家供大家参考,具体如下: 最主要用这个函数,可以处理MySQLdb.escape_string(content). class ...
- 电子邮箱如何注册短靓号?邮箱靓号如何申请
很多人热衷于手机或电子邮箱靓号,近年来更是呈一号难求的趋势.为什么靓号如此有价值呢,其唯一性无需多说,注册一个少一个.如此稀缺,究竟该如何注册呢? 什么是邮箱靓号? 电子邮箱靓号主要有几种类型,分别为 ...
- python创建包含双引号的字符串代码_python 字符串组成MySql 命令时,字符串含有单引号或者双引号导致出错解决办法...
引用自:https://blog.csdn.net/zhaoya_huangqing/article/details/48036839 一.在组成SQL语句并发送命令时完全按照Python中的样式去传 ...
- mysql 分组行号_mysql 显示行号,以及分组排序
建表: CREATE TABLE `my_tb` ( `id` int(11) NOT NULL AUTO_INCREMENT, `parent_code` varchar(255) DEFAULT ...
- ps aux | grep 无法过滤点号
"ps aux | grep" 命令是用来查看进程信息的."grep" 命令可以用来过滤出包含特定字符串的行.但是,该命令不能用来过滤点号,因为点号是进程的一部 ...
- MySQL重要知识点(转载微信公众号)
什么是MySQL? MySQL 是一种关系型数据库,在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展.阿里巴巴数据库系统也大量用到了 MySQL,因此它的稳定性是有保障的. ...
- 计算机 - 知名端口号和注册端口号 - 收集与查询
1.应用场景 主要用于计算机 - 知名端口号和注册端口号 - 收集与查询. 2.学习/操作 1.文档阅读 Service Name and Transport Protocol Port Number ...
- Oracle下绝对文件号和相对文件号区别
一:oracle官方给出的描述 Oracle Database assigns each datafile two associated file numbers, an absolute file ...
最新文章
- Linux+Qt 下同一数据空间vfork多进程间通信的一种高效便捷方式(信号槽直接调用)
- 新康众闫顺成:数据中台建设中的得与失
- 周易Java_周易API接口_免费数据接口 - 极速数据
- python列表元祖字典集合运算_Python基础5:列表 元祖 字典 集合 Json
- RFC1323 timestamp PAWS的实现陷阱
- 【算法导论】第24章迪杰斯特拉算法
- [[UIScreen mainScreen] bounds] 返回的屏幕尺寸不对
- 数据结构与算法之PHP排序算法(桶排序)
- ADOBE CS3 序列号
- Oracle12c CDB和PDB数据库的启动与关闭说明
- Python几十行代码轻松实现微信自动回复机器人
- hdu 5208 Where is Bob
- 数据一致性、准确性、完整性、及时性、有效性
- glide加载大图片白屏崩溃闪退
- ROS下使用C++读取txt文本数据并使用
- 【周赛-简单】5495. 圆形赛道上经过次数最多的扇区
- 微信小程序消息订阅超详细流程步骤
- 债券的到期收益率、即期收益率、远期收益率及远期利率的推导
- 渗透测试-中间件日志包含绕过和php文件读写包含
- 基于DeepDive实现从股权交易公告获取企业与企业之间存在交易关系的概率--实践篇