生成随机数和随机串

一 实例

    /**
     * 生成随即4位随机数
     */
    public String getRandomNum() {
        return (int) ((Math.random() * 9 + 1) * 1000) + "";
    }

二 生成随机串

/**
 * 根据用户id生成不重复邀请码 小于id 754137930为6位,超出后邀请码位数将大于6
 **/
public class generateCode {
    /** 邀请码最小长度,生成邀请码小于该字段,自动补长  **/
    private static final int MIN_CODE_LENGTH_1 = 10;
    /** 位数不足时,充当分隔,该字段为保持唯一性,不放入下方的列表  **/
    private static final String STOP_CHAR_1 = "0";
    private static final String[] CHARS_1 = new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9"};

    /** 兑换码最小长度,生成邀请码小于该字段,自动补长  **/
    private static final int MIN_CODE_LENGTH_2 = 8;
    /** 位数不足时,充当分隔,该字段为保持唯一性,不放入下方的列表  **/
    private static final String STOP_CHAR_2 = "U";
    private static final String[] CHARS_2 = new String[]{"Q","W","E","8","A","S","2","D","Z","X","9","C","7","P","5","K","3","M","J","F","R","4","V","Y","L","T","N","6","B","G","H"};

    /**
     * 默认使用配置一
     * */
    private static int MIN_CODE_LENGTH = MIN_CODE_LENGTH_1;
    private static String STOP_CHAR = STOP_CHAR_1;
    private static String[] CHARS = CHARS_1;
    private static int OFFSET = CHARS_1.length - 1;

    public generateCode(int type) {
        if (type == 2) {
            // 兑换码
            MIN_CODE_LENGTH = MIN_CODE_LENGTH_2;
            STOP_CHAR = STOP_CHAR_2;
            CHARS = CHARS_2;
            OFFSET = CHARS_2.length - 1;
        }
    }

    /**
     * 根据 id 生成邀请码
     * 如果是 6 位的邀请码只能支持 754137930 7亿5千万用户, 超出的id 会成为7位甚至更长的邀请码
     * @param id 用户id
     * @return 邀请码字符串
     */
    public static String id2ShareCode(long id, Integer codeMinLength) {
        if (codeMinLength == null) {
            codeMinLength = MIN_CODE_LENGTH;
        }
        String code = int2chars(id);
        int tailLength = codeMinLength - code.length();
        if (tailLength > 1) {
            code = code + STOP_CHAR + codeTail(tailLength - 1);
        } else if (tailLength == 1) {
            code = code + STOP_CHAR;
        }
        return code;
    }

    /**
     * 根据 id 生成邀请码
     * 如果是 6 位的邀请码只能支持 754137930 7亿5千万用户, 超出的id 会成为7位甚至更长的邀请码
     * @param id 用户id
     * @return 邀请码字符串
     */
    public String id2ShareCode(long id) {
        int codeMinLength = MIN_CODE_LENGTH;
        String code = int2chars(id);
        int tailLength = codeMinLength - code.length();
        if (tailLength > 1) {
            code = code + STOP_CHAR + codeTail(tailLength - 1);
        } else if (tailLength == 1) {
            code = code + STOP_CHAR;
        }
        return code;
    }

    /**
     * 根据邀请码 获取 id
     * @param code 邀请码
     * @return 用户id
     */
    public static long shareCode2id(String code) {
        int inx = code.indexOf(STOP_CHAR);
        if (inx > 0) {
            code = code.substring(0, inx);
        }
        return chars2int(code);
    }

    /**
     * 获取补长的邀请码(随机)
     * @param len 需要的长度
     * */
    private static String codeTail(int len) {
        String res = "";
        Random r = new Random();
        for (int i = 0; i < len; i++) {
            res += CHARS[r.nextInt(OFFSET)];
        }
        return res;
    }

    private static String int2chars(long id) {
        long x = id / OFFSET;
        long remainder = id % OFFSET;
        if (x == 0) {
            return CHARS[(int) id];
        } else if (x < OFFSET) {
            return CHARS[(int) x] + CHARS[(int) remainder];
        } else {
            return int2chars(x) + CHARS[(int) remainder];
        }
    }

    private static long chars2int(String chars) {
        long res = 0;
        int codeLen = chars.length();
        List<String>  totalCharsList = Arrays.asList(CHARS);

        for (int i = 0; i < codeLen; i++) {
            String a = chars.substring(i, i+1);
            if (STOP_CHAR.equals(a)) {
                break;
            }
            if (totalCharsList.contains(a)) {
//                res += (long) totalCharsList.indexOf(a) * (Math.pow(OFFSET, (codeLen - i - 1)));
                res = res * OFFSET + totalCharsList.indexOf(a);
            } else {
                res = 0;
                break;
            }
        }
        return res;
    }
}

二 生成随机串的问题

        由于STOP_CHAR为静态变量,初始值为STOP_CHAR_1 = "0",但是在满足type=2的时候STOP_CHAR 重新被赋值为STOP_CHAR_2="U",此时如果再使用不满足type=2的条件的时候,按常理来说STOP_CHAR的值应该为STOP_CHAR_1 = "0",两次使用同一个对象的时候,此时的STOP_CHAR值仍然为STOP_CHAR_2="U"。

        部分修改


    private static int MIN_CODE_LENGTH = 0;
    private static String STOP_CHAR = "";
    private static String[] CHARS = ""
    private static int OFFSET = "";

    public generateCode(int type) {
        if (type == 1) {
            // 7位字符串
            MIN_CODE_LENGTH = MIN_CODE_LENGTH_1;
            STOP_CHAR = STOP_CHAR_1;
            CHARS = CHARS_1;
            OFFSET = CHARS_1.length - 1;
        }
        if (type == 2) {
            // 兑换码
            MIN_CODE_LENGTH = MIN_CODE_LENGTH_2;
            STOP_CHAR = STOP_CHAR_2;
            CHARS = CHARS_2;
            OFFSET = CHARS_2.length - 1;
        } 
    }

        或者

    private static int MIN_CODE_LENGTH = 0;
    private static String STOP_CHAR = "";
    private static String[] CHARS = ""
    private static int OFFSET = "";

    
    public generateCode() {
            // 7位字符串
            MIN_CODE_LENGTH = MIN_CODE_LENGTH_1;
            STOP_CHAR = STOP_CHAR_1;
            CHARS = CHARS_1;
            OFFSET = CHARS_1.length - 1;
        }

    public generateCode(int type) {
            // 兑换码
            MIN_CODE_LENGTH = MIN_CODE_LENGTH_2;
            STOP_CHAR = STOP_CHAR_2;
            CHARS = CHARS_2;
            OFFSET = CHARS_2.length - 1;
    }

        待后续一一分析,如有问题,希望读者留言告知,谢谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值