6位邀请码的4种实现

前言

邀请码,是网站,app,推广的一种方式,每个用户都拥有一个邀请码,邀请用户,给相应的奖励,以此方法达到快速增长用户的目的。

业务分析

  • 每个用户拥有唯一的一个邀请码,与用户是一对一关系
  • 需要在用户注册的时候生成
  • 邀请码可能生成重复,需要保证唯一
  • 生成邀请码的效率要高

实现方案

说明:6位邀请码由数字 0-9 加上 A-Z 去掉易混淆项,O与0,总共34个字符,可组成34的6次方个邀请码,也就是1544804416个,15亿+个邀请码。

方案1

策略1

Random random = new Random();
StringBuilder inviteCode = new StringBuilder();

String s = "123456789ABCDEFGHIJKLMNPQRSTUVWXYZ";
for (int i = 0; i < 6; i++) {
    int index = random.nextInt(34);
    inviteCode.append(s.charAt(index));
}

System.out.println(inviteCode.toString());

用以上代码生成邀请码,但有可能会生成重复邀请码,需要判断邀请码是否重复,如果重复,需要再次生成邀请码,重复上述步骤,直到产生唯一的邀请码。

优点:思路简单,容易实现

缺点:因判断邀请码是否重复,及可能重新生成邀请码,导致效率不高

方案2

邀请码采用策略1预先生成一批,放到redis list中,当用户进行注册,直接通过rpop获取邀请码,当这批邀请码低于阈值时,异步进行补充。

优点:效率最高

缺点:强依赖redis,当redis不可用时,邀请码获取失败。如果注册量飙升,大于补充速度,会导致无法取到邀请码。

方案3

创建一张用户id同邀请码的映射表,这里的用户id,不仅限于已存在的用户,更重要的是未来注册的用户id的映射,提前生成好足够多的未来用户id同邀请码的映射,当用户注册,为用户生成id,然后去映射表,获取邀请码。本方案的前提是,能够提前知道,用户id,如用户id定义成int自增长

优点:效率很高,稳定性强

缺点:需要创建额外的映射表。用户id需要是int自增

方案4

通过算法,直接为用户id,生成唯一的邀请码,思想是来自base64,改造成的base34算法,将用户id通过base34算法,映射到一个邀请码上,该用户id必须是int类型,算法如下:

策略2

public static String base34(int n) {
    String s = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789";
    int[] array = new int[6];
    int i = 0;

    while (n > 0) {
        int a = n % 34;
        array[i++] = a;
        n = n/34;
    }

    StringBuilder result = new StringBuilder();
    for (int j = array.length -1; j>=0; j--) {
        result.append(s.charAt(array[j]));
    }
    return result.toString();
}

算法思想说明:上面已经说过组成邀请码的字符总共34个,base34算法,就是将一个10进制数字转换为34进制,那么每一位上的数字只可能是0-33,0-33每一个数字分别映射一个字符。那么用户id由10进制,转换为34进制,然后再将每一位数字,替换为所映射的字符,便得到邀请码了。

优点:效率较高,简单

缺点:生成邀请码不够凌乱。用户id需要是int类型。

转载于:https://my.oschina.net/u/3057539/blog/3084200

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值