最近公司开发一个项目要求后端返回唯一昵称,弹出用户昵称编辑框,用户可以自行选择是否需要更改昵称
思路:通过昵称生成工具生成的昵称可能已经被占用,这个时候需要我们从缓存查询看用户昵称是否被占用,如果出现了占用的情况,就需要做一定的去重处理,我这里考虑项目流量在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);
}
}
项目杂记,可供参考学习,如有错误,请帮忙勘正,谢谢