在实际工作中我们经常会用到对身份证进行验证的操作,比如员工档案中身份信息的管理等等。长达18位的数字谁也不敢说每次都能绝对的输入正确,如果能对输入的身份证进行一下验证的话,会最大限度的保证资料的正确性。

接着我们来说说18位身份证的结构吧,大体可以吧18位的数字分为两个部分,前17位表示的是身份信息,也就是哪个省、哪个市,以及出生年月等等,最后一位也就是第18位是效验位,也就是用来验证前17位的信息是否正确的,如果前17位中有某个数字输入有误,那么经过换算后的结果一般情况下是不等于第18位的。

再来说说具体如何进行计算吧。这里我们需要一组固定的数字,即加权因子,一共17个,别问为什么是这17个数字,因为规定给出的就是这些数字,只管用就行了。17个数字分别为{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}。

接着我们需要一个总和,这个总和是用身份证的第i位乘以上面一组数字的第i位相加的出来的,就是 身份证的第一个数字*7+身份证的第2个数字*9...这样把17位计算完毕后会得到一个总和,我们就给这个总和起个名字吧——sum。

再来就是需要一个取余的计算了,用上面得到的总和sum与11进行取余运算,别问为什么是11,就是这么规定的,得到余数,我们给余数也起个名字yu,到这里就基本上差不多了。

接着再给出一组数字——效验位{"1","0","X","9","8","7","6","5","4","3","2"},还是那句话,别问为什么是这些数字,规定就是这样,拿来用就行了。

用身份证的效验位也就是第18位与上面那组效验位数字中的第yu个数进行比较,如何相等的话,身份证就是合法的。

下面给出一个C#代码实现对18位身份证验证地方法,大家可以参考下。

bool checkID(string id)
         {
             //17位加权因子
             int[] wi={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
             string id17=id.Substring(0,17);//获取身份证的前17位
             string idend=id.Substring(17); //获取身份证的效验位(第18位)
             int sum=0;
            //加权求和id[i]*wi[i]求和
             for(int i=0;i<id17.Length;i++)
             {
                 sum+=Convert.ToInt32(id17[i].ToString())*wi[i];
             }
            //效验码
             string[] xiaoyanma={"1","0","X","9","8","7","6","5","4","3","2"};
             //  用加权求和的值与11进行求余运算,并与效验码对应位数进行比较