生成没有连续的三位相同数字账号减少碰撞的办法

最近做了一个功能:注册时为用户生成一个前台展示用的id

id的规则:

  1. 5-11位
  2. 不能重复
  3. 老用户的id等于user表的主键user_id(老用户的账号范围在6000004-6671144之间)
  4. 新用户使用生成规则进行生成
  5. 生成的账号不能包含连续的三位相同数字

流程很简单:

  1. 拿到上次生成的展示id+1
  2. 验证是否在老用户的范围内[是将展示id直接设置为6671145]
  3. 验证现在的展示id是否是靓号[是处理展示id,然后从第二步重新开始]
  4. 验证现在的展示id是否在库里存在[是展示id+1,然后从第二步重新开始]
  5. 获得符合条件的展示id
  6. 记录本次生成的展示id,用于下次生成

我要详细说的是第三步中处理展示id

方案一:每次展示id+1

方案二:每次展示id+100

方案三:从高位开始找到连续的三位相同的数字最低位在展示id中所处的位置n,然后给展示id+10的(count(展示id)-n)次方

方案四:从低位开始找到连续的三位相同的数字中间位在展示id中所处的位置m,然后给展示id+10的(count(展示id)-m)次方

方案一和二因为碰撞的次数实在太多,直接淘汰。

方案三有时候会跳过太多的有效的展示id,方案四计算起来更麻烦。所以后两种方案在项目实施中可以根据具体情况选择

方案三实施:

首先使用正则表达式验证靓号时,可以得到第一次出现连续的三位相同数字aaa,然后找到aaa在show_id中出现的位置,低位的位置就找到了

方案四实施:

首先将展示id切割成数组(每一位都是数组的一个值),然后将数组倒序,循环数组,当找到连续三次相同数字时,跳出循环,得到key,m=key+1.

到这里我的减少碰撞的实施方案就完了。

当然有可能有考虑不周的地方。欢迎拍砖。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值