生成IDCARD号码C#版

举报
motozilog 发表于 2019/01/02 11:04:24 2019/01/02
【摘要】 在网上找了好几个生成器用于业务测试,但却没有一个用起顺手,甚至这么简单的功能都带广告......干脆自己动手写一个!

在网上找了好几个生成器用于业务测试,但却没有一个用起顺手,甚至这么简单的功能都带广告......

干脆自己动手写一个!


核心代码:

        /// <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;
        }


再做个界面

QQ截图20190102105215.png


完整代码

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;
            }
        }
    }
}


搞定!

QQ截图20190102105705.png


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。