生成IDCARD号码C#版
【摘要】 在网上找了好几个生成器用于业务测试,但却没有一个用起顺手,甚至这么简单的功能都带广告......干脆自己动手写一个!
在网上找了好几个生成器用于业务测试,但却没有一个用起顺手,甚至这么简单的功能都带广告......
干脆自己动手写一个!
核心代码:
/// <summary>
/// 生成IDCARD号码C#版,用于业务测试,请勿用于非法用途
/// By motozilog
/// 2019-01-02
/// </summary>
/// <param name="address">地址码:全国行政区划数字代码【GB/T2260】</param>
/// <param name="birthday">出生日期:GBT 7408-2005数据和交换格式 信息交换 日期和时间表示法(即yyyyMMdd)</param>
/// <param name="man">是否为男性</param>
/// <seealso cref="https://mp.weixin.qq.com/s/YEBmaV3d7zF_fJZ3ESq8xw" 56行Python代码实现身份证字典生成器/>
/// <returns></returns>
private HashSet<string> genIdcards(string address,string birthday,bool man)
{
int[] ratios = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };//1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
int[] remains = new int[] { 1, 0, 11, 9, 8, 7, 6, 5, 4, 3, 2 };
HashSet<string> idcards = new HashSet<string>();
//通过穷举获取
for (int id = 1; id <= 999; id++)
{
string idcard = address + birthday + id.ToString("000");
int sum = 0;
//1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
for (int i = 0; i < idcard.Length; i++)
{
int bit = Convert.ToInt32(idcard.Substring(i, 1)) * ratios[i];
//2、将这17位数字和系数相乘的结果相加;
sum = sum + bit;
}
//3、用加出来和除以11,看余数是多少;余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;
int remain = remains[sum % 11];
if (man == true && (remain % 2 == 1))
{
//男性为偶数
idcard = idcard + ((remain == 11) ? "X" : remain.ToString("0")); //如果为11则转换成X
idcards.Add(idcard);
}
else if (man == false && (remain % 2 == 0))
{
//女性为偶数
idcard = idcard + ((remain == 11) ? "X" : remain.ToString("0")); //如果为11则转换成X
idcards.Add(idcard);
}
}
return idcards;
}
再做个界面
完整代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace 号码生成
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
button1_Click(null, null);
}
private void button1_Click(object sender, EventArgs e)
{
HashSet<string> idcards = genIdcards(textBoxAddress.Text, textBoxBirthday.Text, radioButtonMan.Checked);
listViewIdcard.Items.Clear();
foreach (var x in idcards)
{
listViewIdcard.Items.Add(new ListViewItem(x));
}
listViewIdcard.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
Clipboard.SetText(idcards.Take(1).ToArray()[0]);
}
/// <summary>
/// 生成IDCARD号码C#版,用于业务测试,请勿用于非法用途
/// By motozilog
/// 2019-01-02
/// </summary>
/// <param name="address">地址码:全国行政区划数字代码【GB/T2260】</param>
/// <param name="birthday">出生日期:GBT 7408-2005数据和交换格式 信息交换 日期和时间表示法(即yyyyMMdd)</param>
/// <param name="man">是否为男性</param>
/// <seealso cref="https://mp.weixin.qq.com/s/YEBmaV3d7zF_fJZ3ESq8xw" 56行Python代码实现身份证字典生成器/>
/// <returns></returns>
private HashSet<string> genIdcards(string address,string birthday,bool man)
{
int[] ratios = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };//1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
int[] remains = new int[] { 1, 0, 11, 9, 8, 7, 6, 5, 4, 3, 2 };
HashSet<string> idcards = new HashSet<string>();
//通过穷举获取
for (int id = 1; id <= 999; id++)
{
string idcard = address + birthday + id.ToString("000");
int sum = 0;
//1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 ;
for (int i = 0; i < idcard.Length; i++)
{
int bit = Convert.ToInt32(idcard.Substring(i, 1)) * ratios[i];
//2、将这17位数字和系数相乘的结果相加;
sum = sum + bit;
}
//3、用加出来和除以11,看余数是多少;余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2;
int remain = remains[sum % 11];
if (man == true && (remain % 2 == 1))
{
//男性为偶数
idcard = idcard + ((remain == 11) ? "X" : remain.ToString("0")); //如果为11则转换成X
idcards.Add(idcard);
}
else if (man == false && (remain % 2 == 0))
{
//女性为偶数
idcard = idcard + ((remain == 11) ? "X" : remain.ToString("0")); //如果为11则转换成X
idcards.Add(idcard);
}
}
return idcards;
}
private void listViewIdcard_Click(object sender, EventArgs e)
{
if (listViewIdcard.SelectedItems.Count > 0)
{
Clipboard.SetText(listViewIdcard.SelectedItems[0].Text);
labelCopy.Text = "己复制:" + listViewIdcard.SelectedItems[0].Text;
}
}
}
}
搞定!
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)