中英文唯一昵称生成的一种方法

最近公司开发一个项目要求后端返回唯一昵称,弹出用户昵称编辑框,用户可以自行选择是否需要更改昵称
思路:通过昵称生成工具生成的昵称可能已经被占用,这个时候需要我们从缓存查询看用户昵称是否被占用,如果出现了占用的情况,就需要做一定的去重处理,我这里考虑项目流量在5百万左右,所以,开始的时候按照中文名称随机可以生成18万个,然后补4个空位的排列组合的话理论上不可能出现重复昵称。但是出现了我们将如何处理呢?

使用java的continue语句可以实现伪代码如下

        //生成nickName
        String nickName = getRandomName(4);

        //去重算法
       while(userCache.hasBindNickName(nickName)){
               nickName = (new Random().nextInt(10)) + nickName;//昵称去重
               continue;//回调继续
        }
       System.out.println(nickName);

其中userCache.hasBindNickName(nickName)表示从缓存查询昵称是否已经被占用
我这里通过前位补一个随机数来去重,这样的做法很明显的缺点就是可能导致昵称程度不一致,你爷爷已采用重复调用一次昵称生成算法的方案,但必须保证昵称算法返回结果大于项目流量。
下面是整个昵称工具类的详细代码:

import java.sql.SQLOutput;
import java.util.Calendar;
import java.util.Random;

/**
 * 定义昵称生成算法
 */
public class NickNameUtil {
    //自动生成名字(中文),可以生产17万的唯一名字
    public static String getRandomChineseName() {
        String[] firstname = {"赵", "钱", "孙", "李", "周", "吴", "郑", "王",
                "冯", "陈", "楮", "卫", "蒋", "沈", "韩", "杨",
                "朱", "秦", "尤", "许", "何", "吕", "施", "张",
                "孔", "曹", "严", "华", "金", "魏", "陶", "姜",
                "戚", "谢", "邹", "喻", "柏", "水", "窦", "章",
                "云", "苏", "潘", "葛", "奚", "范", "彭", "郎",
                "鲁", "韦", "昌", "马", "苗", "凤", "花", "方",
                "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐",
                "费", "廉", "岑", "薛", "雷", "贺", "倪", "汤",
                "滕", "殷", "罗", "毕", "郝", "邬", "安", "常",
                "乐", "于", "时", "傅", "皮", "卞", "齐", "康",
                "伍", "余", "元", "卜", "顾", "孟", "平", "黄",
                "和", "穆", "萧", "尹", "姚", "邵", "湛", "汪",
                "祁", "毛", "禹", "狄", "米", "贝", "明", "臧",
                "计", "伏", "成", "戴", "谈", "宋", "茅", "庞",
                "熊", "纪", "舒", "屈", "项", "祝", "董", "梁",
                "杜", "阮", "蓝", "闽", "席", "季", "麻", "强",
                "贾", "路", "娄", "危", "江", "童", "颜", "郭",
                "梅", "盛", "林", "刁", "锺", "徐", "丘", "骆",
                "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍",
                "虞", "万", "支", "柯", "昝", "管", "卢", "莫",
                "经", "房", "裘", "缪", "干", "解", "应", "宗",
                "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪",
                "包", "诸", "左", "石", "崔", "吉", "钮", "龚",
                "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁",
                "荀", "羊", "於", "惠", "甄", "麹", "家", "封",
                "芮", "羿", "储", "靳", "汲", "邴", "糜", "松",
                "井", "段", "富", "巫", "乌", "焦", "巴", "弓",
                "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬",
                "全", "郗", "班", "仰", "秋", "仲", "伊", "宫",
                "宁", "仇", "栾", "暴", "甘", "斜", "厉", "戎",
                "祖", "武", "符", "刘", "景", "詹", "束", "龙",
                "叶", "幸", "司", "韶", "郜", "黎", "蓟", "薄",
                "印", "宿", "白", "怀", "蒲", "邰", "从", "鄂",
                "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙",
                "池", "乔", "阴", "郁", "胥", "能", "苍", "双",
                "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄",
                "姬", "申", "扶", "堵", "冉", "宰", "郦", "雍",
                "郤", "璩", "桑", "桂", "濮", "牛", "寿", "通",
                "边", "扈", "燕", "冀", "郏", "浦", "尚", "农",
                "温", "别", "庄", "晏", "柴", "瞿", "阎", "充",
                "慕", "连", "茹", "习", "宦", "艾", "鱼", "容",
                "向", "古", "易", "慎", "戈", "廖", "庾", "终",
                "暨", "居", "衡", "步", "都", "耿", "满", "弘",
                "匡", "国", "文", "寇", "广", "禄", "阙", "东",
                "欧", "殳", "沃", "利", "蔚", "越", "夔", "隆",
                "师", "巩", "厍", "聂", "晁", "勾", "敖", "融",
                "冷", "訾", "辛", "阚", "那", "简", "饶", "空",
                "曾", "毋", "沙", "乜", "养", "鞠", "须", "丰",
                "巢", "关", "蒯", "相", "查", "后", "荆", "红",
                "游", "竺", "权", "逑", "盖", "益", "桓", "公",
                "佟","商","楚","岳", "万俟","司马","上官","欧阳",
                "夏侯","诸葛","闻人","东方",
                "赫连","皇甫","尉迟","公羊",
                "澹台","公冶","宗政","濮阳",
                "淳于","单于","太叔","申屠",
                "公孙","仲孙","轩辕","令狐",
                "锺离","宇文","长孙","慕容",
                "鲜于","闾丘","司徒","司空",
                "丌官","司寇","左丘","子车",
                "颛孙","端木","巫马","公西",
                "漆雕","乐正","壤驷","公良",
                "拓拔","夹谷","宰父","谷梁"
        };
        String[] namelist = {
                "爱", "芳", "伟", "兰", "花", "影", "英", "音",
                "敏", "静", "丽", "乐", "秀", "强", "光", "杰",
                "洁", "倩", "君", "如", "勇", "风", "峰", "磊",
                "娟", "艳", "涛", "平", "刚", "剑", "霞", "燕",
                "梅","妍","亲","婷","青","源","辉","荣","蓉","靖", "军",
                "澄邈","德泽","海超","海阳","海荣","海逸","海昌","瀚钰","瀚文","涵亮","涵煦","涵蓄",
                "涵衍","浩皛","浩波","浩博","浩初","浩宕","浩歌","浩广","浩涆","浩瀚","浩慨","浩阔",
                "浩邈","浩气","浩然","浩思","浩言","鸿宝","鸿波","鸿博","鸿才","鸿畅","鸿畴","鸿达",
                "鸿德","鸿飞","鸿风","鸿福","鸿光","鸿晖","鸿朗","鸿文","鸿熙","鸿羲","鸿禧","鸿信",
                "鸿轩","鸿煊","鸿骞","鸿远","鸿云","鸿运","鸿哲","鸿祯","鸿志","鸿卓","嘉澍","光济",
                "澎湃","彭泽","鹏池","鹏海","浦和","浦泽","瑞渊","越泽","泽洋","泽雨","泽民","哲瀚",
                "博耘","德运","辰宇","辰皓","辰钊","辰铭","辰锟","辰阳","辰龙","辰韦","辰良","辰沛",
                "晨轩","晨涛","晨濡","晨潍","鸿振","吉星","铭晨","起运","胤运","佑运","允晨","运恒",
                "运凡","运凯","运鹏","运浩","运诚","运良","运鸿","运锋","运盛","运升","运杰","运珹",
                "运珧","运骏","运凯","运乾","维运","运晟","运莱","运华","运发","云天","耘志","耘涛",
                "耘豪","星爵","星腾","星睿","星泽","星鹏","星然","震轩","震博","康震","震博","振强",
                "振博","振华","振宇","振锐","振凯","振海","振国","振平","振荣","振翱","中震","子辰",
                "昂然","昂雄","昂杰","昂熙","昌勋","昌盛","昌淼","昌茂","昌黎","昌燎","昌翰","晨朗",
                "德明","德昌","德曜","范明","飞昂","高朗","高旻","晗日","晗昱","瀚玥","瀚昂","瀚彭",
                "昊然","昊天","昊苍","昊英","昊宇","昊嘉","昊明","昊伟","昊硕","昊磊","昊东","鸿晖",
                "鸿朗","华晖","金鹏","晋鹏","敬曦","景明","景天","景浩","景行","景中","景逸","景彰",
                "景平","俊晖","君昊","昆琦","昆鹏","昆纬","昆宇","昆锐","昆卉","昆峰","昆颉","昆谊",
                "昆皓","昆鹏","昆明","昆杰","昆雄","昆纶","鹏涛","鹏煊","绍晖","文昂","文景","曦哲",
                "曦晨","曦之","新曦","鑫鹏","旭彬","旭尧","旭鹏","旭东","旭炎","炫明","宣朗","学智",
                "轩昂","彦昌","曜坤","曜栋","曜文","曜曦","曜灿","曜瑞","永昌","子昂","智宇","智晖",
                "智伟","智杰","智刚","智阳","昌勋","昌盛","昌淼","昌茂","昌黎","昌燎","昌翰","晨朗",
                "昂然","昂雄","昂杰","昂熙","范明","飞昂","高朗","高旻","晗日","晗昱","瀚玥","瀚昂",
                "德明","德昌","德曜","智伟","智杰","智刚","智阳","瀚彭","旭炎","炫明","宣朗","学智",
                "昊然","昊天","昊苍","昊英","昊宇","昊嘉","昊明","昊伟","昊硕","昊磊","昊东","鸿晖",
                "鸿朗","华晖","金鹏","晋鹏","敬曦","景明","景天","景浩","景行","景中","景逸","景彰",
                "昆皓","昆鹏","昆明","昆杰","昆雄","昆纶","鹏涛","鹏煊","绍晖","文昂","文景","曦哲",
                "景平","俊晖","君昊","昆琦","昆鹏","昆纬","昆宇","昆锐","昆卉","昆峰","昆颉","昆谊",
                "轩昂","彦昌","曜坤","曜栋","曜文","曜曦","曜灿","曜瑞","永昌","子昂","智宇","智晖",
                "曦晨","曦之","新曦","鑫鹏","旭彬","旭尧","旭鹏","旭东"};

        int a = (int) Math.abs(firstname.length * Math.random());
        int b = (int) Math.abs(namelist.length * Math.random());
        String name= firstname[a] + namelist[b];
        return name;
    }

    //生成随机用户名,数字和字母组成,
    public static String getStringRandom(int length) {
        String val = "";
        Random random = new Random();
        //参数length,表示生成几位随机数
        for(int i = 0; i < length; i++) {
            String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
            //输出字母还是数字
            if( "char".equalsIgnoreCase(charOrNum) ) {
                //输出是大写字母还是小写字母
                int temp = random.nextInt(2) % 2 == 0 ? 65 : 97;
                val += (char)(random.nextInt(26) + temp);
            } else if( "num".equalsIgnoreCase(charOrNum) ) {
                val += String.valueOf(random.nextInt(10));
            }
        }
        return val;
    }

    /**
     * 返回中英文名称,理论上可以生产  178000后面length个0 个唯一的用户名
     * @param length 随机生成的名字中英文字母的个数
     * @return
     */
    public static String getRandomName(int length) {
      return getRandomChineseName()+getStringRandom(length);
    }

    public static void main(String[] args) {

        //生成nickName
        String nickName = getRandomName(4);

        //去重算法
       while(userCache.hasBindNickName(nickName)){
               nickName = (new Random().nextInt(10)) + nickName;//昵称去重
               continue;//回调继续
        }
       System.out.println(nickName);
    }
}

项目杂记,可供参考学习,如有错误,请帮忙勘正,谢谢

你可能感兴趣的:(中英文唯一昵称生成的一种方法)