邀请码生成器

import java.util.Random;
 
/**
  * 邀请码生成器,算法原理:<br/>
  * 1) 获取id: 1127738 <br/>
  * 2) 使用自定义进制转为:gpm6 <br/>
  * 3) 转为字符串,并在后面加'o'字符:gpm6o <br/>
  * 4)在后面随机产生若干个随机数字字符:gpm6o7 <br/>
  * 转为自定义进制后就不会出现o这个字符,然后在后面加个'o',这样就能确定唯一性。最后在后面产生一些随机字符进行补全。<br/>
  * @author jiayu.qiu
  */
public class ShareCodeUtil {
 
     /** 自定义进制(0,1没有加入,容易与o,l混淆) */
     private static final char [] r= new char []{ 'q' , 'w' , 'e' , '8' , 'a' , 's' , '2' , 'd' , 'z' , 'x' , '9' , 'c' , '7' , 'p' , '5' , 'i' , 'k' , '3' , 'm' , 'j' , 'u' , 'f' , 'r' , '4' , 'v' , 'y' , 'l' , 't' , 'n' , '6' , 'b' , 'g' , 'h' };
 
     /** (不能与自定义进制有重复) */
     private static final char b= 'o' ;
 
     /** 进制长度 */
     private static final int binLen=r.length;
 
     /** 序列最小长度 */
     private static final int s= 6 ;
 
     /**
      * 根据ID生成六位随机码
      * @param id ID
      * @return 随机码
      */
     public static String toSerialCode( long id) {
         char [] buf= new char [ 32 ];
         int charPos= 32 ;
 
         while ((id / binLen) > 0 ) {
             int ind=( int )(id % binLen);
             // System.out.println(num + "-->" + ind);
             buf[--charPos]=r[ind];
             id /= binLen;
         }
         buf[--charPos]=r[( int )(id % binLen)];
         // System.out.println(num + "-->" + num % binLen);
         String str= new String(buf, charPos, ( 32 - charPos));
         // 不够长度的自动随机补全
         if (str.length() < s) {
             StringBuilder sb= new StringBuilder();
             sb.append(b);
             Random rnd= new Random();
             for ( int i= 1 ; i < s - str.length(); i++) {
             sb.append(r[rnd.nextInt(binLen)]);
             }
             str+=sb.toString();
         }
         return str;
     }
 
     public static long codeToId(String code) {
         char chs[]=code.toCharArray();
         long res=0L;
         for ( int i= 0 ; i < chs.length; i++) {
             int ind= 0 ;
             for ( int j= 0 ; j < binLen; j++) {
                 if (chs[i] == r[j]) {
                     ind=j;
                     break ;
                 }
             }
             if (chs[i] == b) {
                 break ;
             }
             if (i > 0 ) {
                 res=res * binLen + ind;
             } else {
                 res=ind;
             }
             // System.out.println(ind + "-->" + res);
         }
         return res;
     }
}


转载于:https://my.oschina.net/u/2274056/blog/518939

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值