您的位置:首页 > 编程语言 > Java开发

JAVA随机生成名字和身份证号

2018-02-28 22:06 344 查看
今天在工作中需要造几十万的姓名和身份证号。。。手写是不可能的,只能用JAVA代码实现,代替手工,随机生成一堆姓名和身份证号了,顺便在这里记录一下实现的思路。。。
0.先来普及一下计算机中的汉字:GB 2312-80 是中国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,由中国国家标准总局发布,1981年5月1日实施。
GB2312 编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持 GB 2312。
GB2312 标准共收录 6763 个汉字,其中一级汉字 3755 个,二级汉字 3008 个;同时收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、
俄语西里尔字母在内的 682 个字符。GB2312 的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆 99.75% 的使用频率。
对于人名、古汉语等方面出现的罕用字,GB2312 不能处理,这导致了后来 GBK 及 GB18030 汉字字符集的出现。

GB2312 中对所收汉字进行了“分区”处理,每区含有 94 个汉字/符号。这种表示方式也称为区位码。

01 - 09 区为特殊符号。
16 - 55 区为一级汉字,按拼音排序。
56 - 87 区为二级汉字,按部首/笔画排序。
10 - 15 区及 88 - 94 区则未有编码。举例来说,“啊”字是 GB2312 之中的第一个汉字,它的区位码就是 1601。

每个汉字及符号以两个字节来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。
“高位字节”使用了 0xA1 - 0xF7(把 01 - 87 区的区号加上 0xA0),“低位字节”使用了 0xA1 - 0xFE(把 01 - 94 位的位号加上 0xA0)。
由于一级汉字从 16 区起始,汉字区的“高位字节”的范围是 0xB0 - 0xF7,“低位字节”的范围是 0xA1 - 0xFE,占用的码位是 72 * 94 = 6768。
其中有 5 个空位是 D7FA - D7FE。例如“啊”字在大多数程序中,会以两个字节,0xB0(第一个字节)0xA1(第二个字节)储存。
(与区位码对比:0xB0 = 0xA0 + 16, 0xA1 = 0xA0 + 1)。

国家标准 GB 18030-2005《信息技术 中文编码字符集》,是中华人民共和国现时最新的内码字集,与 GB 2312-1980 完全兼容,与 GBK 基本兼容,
支持 GB 13000 及 Unicode 的全部统一汉字,共收录汉字 70244 个。现行版本为国家质量监督检验总局和中国国家标准化管理委员会于2005年11月8日发布,
2006年5月1日实施,为在中国境内所有软件产品支持的强制标准。

(以上资料来源于“维基百科”)
1.基于这个原则,生成名字的话,首先姓氏不用担心,就用一个百家姓的数组来存储姓氏,随机取得一个姓氏,然后再随机生成一个汉字,两者相加就生成了一个人的名字了。
代码如下: /**
* 随机生成名字+身份证号
*
* @param dataLength
* @return
*/
private static List<NameData> makeData(int dataLength) {
// 写一个百家姓的数组
String[] Surname = { "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈",
"韩", "杨", "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶",
"姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎",
"鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费",
"廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常", "乐", "于",
"时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和", "穆", "萧",
"尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成", "戴",
"谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闵", "席",
"季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭", "梅", "盛", "林", "刁", "钟", "徐",
"邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍", "虞", "万", "支", "柯", "昝", "管", "卢",
"莫", "经", "房", "裘", "缪", "干", "解", "应", "宗", "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪",
"包", "诸", "左", "石", "崔", "吉", "钮", "龚", "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀",
"羊", "于", "惠", "甄", "曲", "家", "封", "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段",
"富", "巫", "乌", "焦", "巴", "弓", "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班",
"仰", "秋", "仲", "伊", "宫", "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎", "祖", "武", "符", "刘",
"景", "詹", "束", "龙", "叶", "幸", "司", "韶", "郜", "黎", "蓟", "溥", "印", "宿", "白", "怀", "蒲",
"邰", "从", "鄂", "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "郁", "胥", "能",
"苍", "双", "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦",
"雍", "却", "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "浦", "尚", "农", "温",
"别", "庄", "晏", "柴", "瞿", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容", "向", "古",
"易", "慎", "戈", "廖", "庾", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘", "匡", "国", "文",
"寇", "广", "禄", "阙", "东", "欧", "殳", "沃", "利", "蔚", "越", "夔", "隆", "师", "巩", "厍", "聂",
"晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空", "曾", "毋", "沙", "乜", "养",
"鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红", "游", "郏", "竺", "权", "逯", "盖",
"益", "桓", "公", "仉", "督", "岳", "帅", "缑", "亢", "况", "郈", "有", "琴", "归", "海", "晋", "楚",
"闫", "法", "汝", "鄢", "涂", "钦", "商", "牟", "佘", "佴", "伯", "赏", "墨", "哈", "谯", "篁", "年",
"爱", "阳", "佟", "言", "福", "南", "火", "铁", "迟", "漆", "官", "冼", "真", "展", "繁", "檀", "祭",
"密", "敬", "揭", "舜", "楼", "疏", "冒", "浑", "挚", "胶", "随", "高", "皋", "原", "种", "练", "弥",
"仓", "眭", "蹇", "覃", "阿", "门", "恽", "来", "綦", "召", "仪", "风", "介", "巨", "木", "京", "狐",
"郇", "虎", "枚", "抗", "达", "杞", "苌", "折", "麦", "庆", "过", "竹", "端", "鲜", "皇", "亓", "老",
"是", "秘", "畅", "邝", "还", "宾", "闾", "辜", "纵", "侴", "万俟", "司马", "上官", "欧阳", "夏侯",
"诸葛", "闻人", "东方", "赫连", "皇甫", "羊舌", "尉迟", "公羊", "澹台", "公冶", "宗正", "濮阳", "淳于", "单于",
"太叔", "申屠", "公孙", "仲孙", "轩辕", "令狐", "钟离", "宇文", "长孙", "慕容", "鲜于", "闾丘", "司徒", "司空",
"兀官", "司寇", "南门", "呼延", "子车", "颛孙", "端木", "巫马", "公西", "漆雕", "车正", "壤驷", "公良", "拓跋",
"夹谷", "宰父", "谷梁", "段干", "百里", "东郭", "微生", "梁丘", "左丘", "东门", "西门", "南宫", "第五", "公仪",
"公乘", "太史", "仲长", "叔孙", "屈突", "尔朱", "东乡", "相里", "胡母", "司城", "张廖", "雍门", "毋丘", "贺兰",
"綦毋", "屋庐", "独孤", "南郭", "北宫", "王孙" };
Random random = new Random(System.currentTimeMillis());

// List集合存储姓名+身份证号实体类
List<NameData> nameDataList = new ArrayList<>();
// 循环dataLength 我要生成这么多数据量的数据
for (int i = 0; i < dataLength; i++) {
// 随机取得一个姓氏
int index = random.nextInt(Surname.length - 1);
String nameSur = Surname[index];
String name = nameSur;
NameData nameData = new NameData();
// nextBoolean() 方法用于从该随机数生成器的序列得到下一个伪均匀分布的布尔值。
// 根据随机布尔值,确定名字是一个字还是两个字
if (random.nextBoolean()) {
name += getName() + getName();
} else {
name += getName();
}
nameData.setName(name);
// 再给每个生成的名字加个随机身份证号
String idCardNumber = makeidCardNumber();
nameData.setIdCardNumber(idCardNumber);
nameDataList.add(nameData);
//System.out.println(name + ":" + idCardNumber);
}
return nameDataList;
}生成汉字的代码:/**
* 随机获取一个汉字来组成名字
*
* @return
*/
public static String getName() {
String nameStr = "";
int highCode, lowCode;
Random random = new Random();
// 区码,0xA0打头,从第16区开始,即0xB0=11*16=176,16~55一级汉字,56~87二级汉字
highCode = (176 + Math.abs(random.nextInt(71)));
random = new Random();
// 位码,0xA0打头,范围第1~94列
lowCode = 161 + Math.abs(random.nextInt(94));

byte[] codeArr = new byte[2];
codeArr[0] = (new Integer(highCode)).byteValue();
codeArr[1] = (new Integer(lowCode)).byteValue();
try {
// 区位码组合成汉字
nameStr = new String(codeArr, "GB2312");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return nameStr;
}2.接下来随机生成身份证号:
身份证号是啥?户籍所在地(第1到第6位) + 出生日期(第7到第14位) + 落户派出所代码(第15、16位) + 性别代码(第17位) + 验证码(第18位)

所以就需要随机获取一个户籍所在地的区号,还要随机生成一个出生日期,还要随机生成15/16/17位,再计算得出一个验证码作为第18位。
这里的户籍所在地的区号以北京市为例:
2.1随机获取一个户籍所在地的区号:(将区号放到一个Map集合中) // 户籍所在地(以北京为例)
Map<String, Integer> registerLocation = new HashMap<>();
registerLocation.put("北京市", 110000);
registerLocation.put("市辖区", 110100);
registerLocation.put("东城区", 110101);
registerLocation.put("西城区", 110102);
registerLocation.put("崇文区", 110103);
registerLocation.put("宣武区", 110104);
registerLocation.put("朝阳区", 110105);
registerLocation.put("丰台区", 110106);
registerLocation.put("石景山区", 110107);
registerLocation.put("海淀区", 110108);
registerLocation.put("门头沟区", 110109);
registerLocation.put("房山区", 110111);
registerLocation.put("通州区", 110112);
registerLocation.put("顺义区", 110113);
registerLocation.put("昌平区", 110114);
registerLocation.put("大兴区", 110115);
registerLocation.put("怀柔区", 110116);
registerLocation.put("平谷区", 110117);
registerLocation.put("县", 110200);
registerLocation.put("密云县", 110228);
registerLocation.put("延庆县", 110229);
registerLocation.put("天津市", 120000);
registerLocation.put("市辖区", 120100);
registerLocation.put("和平区", 120101);
registerLocation.put("河东区", 120102);
registerLocation.put("河西区", 120103);
registerLocation.put("南开区", 120104);
registerLocation.put("河北区", 120105);
registerLocation.put("红桥区", 120106);
registerLocation.put("东丽区", 120110);
registerLocation.put("西青区", 120111);
registerLocation.put("津南区", 120112);
registerLocation.put("北辰区", 120113);
registerLocation.put("武清区", 120114);
registerLocation.put("宝坻区", 120115);
registerLocation.put("县", 120200);
registerLocation.put("宁河县", 120221);
registerLocation.put("静海县", 120223);
registerLocation.put("蓟 县", 120225);
/**
* 随机获取区号
* @param registerLocation
* @return
*/
public static String randomLocationCode(Map<String, Integer> registerLocation) {
int index = (int) (Math.random() * registerLocation.size());
Collection<Integer> values = registerLocation.values();
Iterator<Integer> it = values.iterator();
int i = 0;
int locationCode = 0;
while (i <= index && it.hasNext()) {
i++;
if (i == index) {
locationCode = it.next();
}
}
return String.valueOf(locationCode);
}2.2随机获得出生日期: /**
* 随机生成出生日期
*
* @return
*/
public static String randomBirthday() {
Calendar birthday = Calendar.getInstance();
birthday.set(Calendar.YEAR, (int) (Math.random() * 60) + 1950);
birthday.set(Calendar.MONTH, (int) (Math.random() * 12));
birthday.set(Calendar.DATE, (int) (Math.random() * 31));

StringBuilder builder = new StringBuilder();
builder.append(birthday.get(Calendar.YEAR));
long month = birthday.get(Calendar.MONTH) + 1;
if (month < 10) {
builder.append("0");
}
builder.append(month);
long date = birthday.get(Calendar.DATE);
if (date < 10) {
builder.append("0");
}
builder.append(date);
return builder.toString();
}2.3 随机获取落户派出所代码(第15、16位) + 性别代码(第17位)/**
* 随机获取落户派出所代码(第15、16位) + 性别代码(第17位)
* 直接生成三位数
* @return
*/
public static String randomCode() {
int code = (int) (Math.random() * 1000);
if (code < 10) {
return "00" + code;
} else if (code < 100) {
return "0" + code;
} else {
return "" + code;
}
}2.4 计算得到身份证号的第18位:
这里就有知识含量了:
身份证校验码的计算方法:

将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2
将这17位数字和系数相乘的结果相加。
用加出来和除以11,看余数是多少?
余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。

其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。
代码如下: public static String verificationCode(String str17) {
char[] chars = str17.toCharArray();
if (chars.length < 17) {
return " ";
}
// 前十七位分别对应的系数
int[] coefficient = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
// 最后应该取得的第十八位的验证码
char[] resultChar = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
int[] numberArr = new int[17];
int result = 0;
for (int i = 0; i < numberArr.length; i++) {
numberArr[i] = Integer.parseInt(chars[i] + "");
}
for (int i = 0; i < numberArr.length; i++) {
result += coefficient[i] * numberArr[i];
}
return String.valueOf(resultChar[result % 11]);
}3.这么的,随机生成姓名和身份证号的逻辑就算处理完了~~~
代码还是很简单的,一下附上完整代码,随机生成姓名和身份证号,返回List
首先写一个实体类:package com.yushen.data;

/**
* 名字+身份证号数据实体类
* @class_name NameData.java

*/
public class NameData {

private String name;

private String idCardNumber;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getIdCardNumber() {
return idCardNumber;
}

public void setIdCardNumber(String idCardNumber) {
this.idCardNumber = idCardNumber;
}
}接下来是生成数据返回List的处理代码:package com.yushen.data;

import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
*
* 随机生成汉字姓名(10万数据量) + 身份证号
*
* @class_name MakeData.java
* @package_name com.yushen.data
*/
public class MakeData {

public static void main(String[] args) {
// 输入一个参数,这个参数代表你想随机生成多少数据量的数据,这里先写好 因为我需要10万的数据量
int dataLength = 100;
List<NameData> dataList = makeData(dataLength);
for(int i = 0 ; i< dataList.size();i++){
System.out.println("姓名:" + dataList.get(i).getName() +",身份证号:" + dataList.get(i).getIdCardNumber());
}
}

/**
* 随机生成名字+身份证号
*
* @param dataLength
* @return
*/
private static List<NameData> makeData(int dataLength) {
// 写一个百家姓的数组
String[] Surname = { "赵", "钱", "孙", "李", "周", "吴", "郑", "王", "冯", "陈", "褚", "卫", "蒋", "沈",
"韩", "杨", "朱", "秦", "尤", "许", "何", "吕", "施", "张", "孔", "曹", "严", "华", "金", "魏", "陶",
"姜", "戚", "谢", "邹", "喻", "柏", "水", "窦", "章", "云", "苏", "潘", "葛", "奚", "范", "彭", "郎",
"鲁", "韦", "昌", "马", "苗", "凤", "花", "方", "俞", "任", "袁", "柳", "酆", "鲍", "史", "唐", "费",
"廉", "岑", "薛", "雷", "贺", "倪", "汤", "滕", "殷", "罗", "毕", "郝", "邬", "安", "常", "乐", "于",
"时", "傅", "皮", "卞", "齐", "康", "伍", "余", "元", "卜", "顾", "孟", "平", "黄", "和", "穆", "萧",
"尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "贝", "明", "臧", "计", "伏", "成", "戴",
"谈", "宋", "茅", "庞", "熊", "纪", "舒", "屈", "项", "祝", "董", "梁", "杜", "阮", "蓝", "闵", "席",
"季", "麻", "强", "贾", "路", "娄", "危", "江", "童", "颜", "郭", "梅", "盛", "林", "刁", "钟", "徐",
"邱", "骆", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍", "虞", "万", "支", "柯", "昝", "管", "卢",
"莫", "经", "房", "裘", "缪", "干", "解", "应", "宗", "丁", "宣", "贲", "邓", "郁", "单", "杭", "洪",
"包", "诸", "左", "石", "崔", "吉", "钮", "龚", "程", "嵇", "邢", "滑", "裴", "陆", "荣", "翁", "荀",
"羊", "于", "惠", "甄", "曲", "家", "封", "芮", "羿", "储", "靳", "汲", "邴", "糜", "松", "井", "段",
"富", "巫", "乌", "焦", "巴", "弓", "牧", "隗", "山", "谷", "车", "侯", "宓", "蓬", "全", "郗", "班",
"仰", "秋", "仲", "伊", "宫", "宁", "仇", "栾", "暴", "甘", "钭", "厉", "戎", "祖", "武", "符", "刘",
"景", "詹", "束", "龙", "叶", "幸", "司", "韶", "郜", "黎", "蓟", "溥", "印", "宿", "白", "怀", "蒲",
"邰", "从", "鄂", "索", "咸", "籍", "赖", "卓", "蔺", "屠", "蒙", "池", "乔", "阴", "郁", "胥", "能",
"苍", "双", "闻", "莘", "党", "翟", "谭", "贡", "劳", "逄", "姬", "申", "扶", "堵", "冉", "宰", "郦",
"雍", "却", "璩", "桑", "桂", "濮", "牛", "寿", "通", "边", "扈", "燕", "冀", "浦", "尚", "农", "温",
"别", "庄", "晏", "柴", "瞿", "阎", "充", "慕", "连", "茹", "习", "宦", "艾", "鱼", "容", "向", "古",
"易", "慎", "戈", "廖", "庾", "终", "暨", "居", "衡", "步", "都", "耿", "满", "弘", "匡", "国", "文",
"寇", "广", "禄", "阙", "东", "欧", "殳", "沃", "利", "蔚", "越", "夔", "隆", "师", "巩", "厍", "聂",
"晁", "勾", "敖", "融", "冷", "訾", "辛", "阚", "那", "简", "饶", "空", "曾", "毋", "沙", "乜", "养",
"鞠", "须", "丰", "巢", "关", "蒯", "相", "查", "后", "荆", "红", "游", "郏", "竺", "权", "逯", "盖",
"益", "桓", "公", "仉", "督", "岳", "帅", "缑", "亢", "况", "郈", "有", "琴", "归", "海", "晋", "楚",
"闫", "法", "汝", "鄢", "涂", "钦", "商", "牟", "佘", "佴", "伯", "赏", "墨", "哈", "谯", "篁", "年",
"爱", "阳", "佟", "言", "福", "南", "火", "铁", "迟", "漆", "官", "冼", "真", "展", "繁", "檀", "祭",
"密", "敬", "揭", "舜", "楼", "疏", "冒", "浑", "挚", "胶", "随", "高", "皋", "原", "种", "练", "弥",
"仓", "眭", "蹇", "覃", "阿", "门", "恽", "来", "綦", "召", "仪", "风", "介", "巨", "木", "京", "狐",
"郇", "虎", "枚", "抗", "达", "杞", "苌", "折", "麦", "庆", "过", "竹", "端", "鲜", "皇", "亓", "老",
"是", "秘", "畅", "邝", "还", "宾", "闾", "辜", "纵", "侴", "万俟", "司马", "上官", "欧阳", "夏侯",
"诸葛", "闻人", "东方", "赫连", "皇甫", "羊舌", "尉迟", "公羊", "澹台", "公冶", "宗正", "濮阳", "淳于", "单于",
"太叔", "申屠", "公孙", "仲孙", "轩辕", "令狐", "钟离", "宇文", "长孙", "慕容", "鲜于", "闾丘", "司徒", "司空",
"兀官", "司寇", "南门", "呼延", "子车", "颛孙", "端木", "巫马", "公西", "漆雕", "车正", "壤驷", "公良", "拓跋",
"夹谷", "宰父", "谷梁", "段干", "百里", "东郭", "微生", "梁丘", "左丘", "东门", "西门", "南宫", "第五", "公仪",
"公乘", "太史", "仲长", "叔孙", "屈突", "尔朱", "东乡", "相里", "胡母", "司城", "张廖", "雍门", "毋丘", "贺兰",
"綦毋", "屋庐", "独孤", "南郭", "北宫", "王孙" };
Random random = new Random(System.currentTimeMillis());

// List集合存储姓名+身份证号实体类
List<NameData> nameDataList = new ArrayList<>();
// 循环dataLength 我要生成这么多数据量的数据
for (int i = 0; i < dataLength; i++) {
// 随机取得一个姓氏
int index = random.nextInt(Surname.length - 1);
String nameSur = Surname[index];
String name = nameSur;
NameData nameData = new NameData();
// nextBoolean() 方法用于从该随机数生成器的序列得到下一个伪均匀分布的布尔值。
// 根据随机布尔值,确定名字是一个字还是两个字
if (random.nextBoolean()) {
name += getName() + getName();
} else {
name += getName();
}
nameData.setName(name);
// 再给每个生成的名字加个随机身份证号
String idCardNumber = makeidCardNumber();
nameData.setIdCardNumber(idCardNumber);
nameDataList.add(nameData);
//System.out.println(name + ":" + idCardNumber);
}
return nameDataList;
}

/**
* 随机获取一个汉字来组成名字
*
* @return
*/
public static String getName() {
String nameStr = "";
int highCode, lowCode;
Random random = new Random();
// 区码,0xA0打头,从第16区开始,即0xB0=11*16=176,16~55一级汉字,56~87二级汉字
highCode = (176 + Math.abs(random.nextInt(71)));
random = new Random();
// 位码,0xA0打头,范围第1~94列
lowCode = 161 + Math.abs(random.nextInt(94));

byte[] codeArr = new byte[2];
codeArr[0] = (new Integer(highCode)).byteValue();
codeArr[1] = (new Integer(lowCode)).byteValue();
try {
// 区位码组合成汉字
nameStr = new String(codeArr, "GB2312");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return nameStr;
}

/**
* 随机生成身份证号
*
* @return
*/
private static String makeidCardNumber() {
// 身份证号是啥?户籍所在地(第1到第6位) + 出生日期(第7到第14位) + 落户派出所代码(第15、16位) + 性别代码(第17位) + 验证码(第18位)
// 户籍所在地(以北京为例)
Map<String, Integer> registerLocation = new HashMap<>();
registerLocation.put("北京市", 110000);
registerLocation.put("市辖区", 110100);
registerLocation.put("东城区", 110101);
registerLocation.put("西城区", 110102);
registerLocation.put("崇文区", 110103);
registerLocation.put("宣武区", 110104);
registerLocation.put("朝阳区", 110105);
registerLocation.put("丰台区", 110106);
registerLocation.put("石景山区", 110107);
registerLocation.put("海淀区", 110108);
registerLocation.put("门头沟区", 110109);
registerLocation.put("房山区", 110111);
registerLocation.put("通州区", 110112);
registerLocation.put("顺义区", 110113);
registerLocation.put("昌平区", 110114);
registerLocation.put("大兴区", 110115);
registerLocation.put("怀柔区", 110116);
registerLocation.put("平谷区", 110117);
registerLocation.put("县", 110200);
registerLocation.put("密云县", 110228);
registerLocation.put("延庆县", 110229);
registerLocation.put("天津市", 120000);
registerLocation.put("市辖区", 120100);
registerLocation.put("和平区", 120101);
registerLocation.put("河东区", 120102);
registerLocation.put("河西区", 120103);
registerLocation.put("南开区", 120104);
registerLocation.put("河北区", 120105);
registerLocation.put("红桥区", 120106);
registerLocation.put("东丽区", 120110);
registerLocation.put("西青区", 120111);
registerLocation.put("津南区", 120112);
registerLocation.put("北辰区", 120113);
registerLocation.put("武清区", 120114);
registerLocation.put("宝坻区", 120115);
registerLocation.put("县", 120200);
registerLocation.put("宁河县", 120221);
registerLocation.put("静海县", 120223);
registerLocation.put("蓟 县", 120225);

StringBuffer strBuffer = new StringBuffer();
// 区号
strBuffer.append(randomLocationCode(registerLocation));
// 身份证号
strBuffer.append(randomBirthday());
// 15、16、17位
strBuffer.append(randomCode());
// 利用前十七位获取第十八位
String eighteenth = verificationCode(strBuffer.toString());
strBuffer.append(eighteenth);
return strBuffer.toString();
}

/**
* 随机获取区号
* @param registerLocation
* @return
*/
public static String randomLocationCode(Map<String, Integer> registerLocation) {
int index = (int) (Math.random() * registerLocation.size());
Collection<Integer> values = registerLocation.values();
Iterator<Integer> it = values.iterator();
int i = 0;
int locationCode = 0;
while (i <= index && it.hasNext()) {
i++;
if (i == index) {
locationCode = it.next();
}
}
return String.valueOf(locationCode);
}

/**
* 随机生成出生日期
*
* @return
*/
public static String randomBirthday() {
Calendar birthday = Calendar.getInstance();
birthday.set(Calendar.YEAR, (int) (Math.random() * 60) + 1950);
birthday.set(Calendar.MONTH, (int) (Math.random() * 12));
birthday.set(Calendar.DATE, (int) (Math.random() * 31));

StringBuilder builder = new StringBuilder();
builder.append(birthday.get(Calendar.YEAR));
long month = birthday.get(Calendar.MONTH) + 1;
if (month < 10) {
builder.append("0");
}
builder.append(month);
long date = birthday.get(Calendar.DATE);
if (date < 10) {
builder.append("0");
}
builder.append(date);
return builder.toString();
}
/**
* 随机获取落户派出所代码(第15、16位) + 性别代码(第17位)
* 直接生成三位数
* @return
*/
public static String randomCode() {
int code = (int) (Math.random() * 1000);
if (code < 10) {
return "00" + code;
} else if (code < 100) {
return "0" + code;
} else {
return "" + code;
}
}
/**
* 生成第18位身份证号
* @param chars
* @return
* 身份证校验码的计算方法
* 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
* 将这17位数字和系数相乘的结果相加。
* 用加出来和除以11,看余数是多少?
* 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。
* 其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。
*/
public static String verificationCode(String str17) {
char[] chars = str17.toCharArray();
if (chars.length < 17) {
return " ";
}
// 前十七位分别对应的系数
int[] coefficient = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
// 最后应该取得的第十八位的验证码
char[] resultChar = { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' };
int[] numberArr = new int[17];
int result = 0;
for (int i = 0; i < numberArr.length; i++) {
numberArr[i] = Integer.parseInt(chars[i] + "");
}
for (int i = 0; i < numberArr.length; i++) {
result += coefficient[i] * numberArr[i];
}
return String.valueOf(resultChar[result % 11]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息