每次玩游戏注册账号都很麻烦,因为需要输入身份证号码,又不希望自己信息泄露,所以每次都需要上网查一个身份证号。
一般游戏厂商,是没有办法接入获得公安系统个人信息的,他们并不能校验身份证的真实性。那么,为什么我们在注册游戏时如果乱输入一个身份证号码,系统会报错呢?这是因为身份证是有规则的,而且最后一位是校验位,我们乱输入当然会查出来。
本文会简单介绍身份证的规则,以及校验方式,并给出一个随机生成身份证工具,供平时注册账号使用。
1. 身份证的组成部分
现在身份证是18位,由地址码、生日期码、顺序码、校验码组成。
地址码(6位)生日期码(8位)顺序码(3位)校验码(1位)
地址码
表示户口所在地,1-2位省、自治区、直辖市代码,3-4位地级市、盟、自治州代码,5-6位县、县级市、区代码。具体可以访问国家统计局网站,搜索行政区划代码,查看最新的数据。
生日期码
出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符,如19491001。
顺序码
顺序码一共3位,根据当地的出生婴儿编定的顺序号,不确定当地如果一天出生1000个婴儿怎么办(超过三位)。另外,最后一位用来区分性别,如果是奇数分给男性,偶数分给女性。
校验码
根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码,很多网站检测身份证是否正确都是对校验码进行核对。
2. 身份证生成规则
以王春花为例,她的身份证号码是14042919740730782X,我们看下是如何生成的。
出生在武乡县,所以地址码是140429。
出生日期是1974年7月30日,生日期码是19740730。
结合王春花是女性,以及当地出生编定顺序号,分配的顺序码是782。
至此,王春花身份证前17位便得到了14042919740730782,而最后一位是根据前17位计算得来。
3. 校验码生成规则
将前面的身份证号码17位数分别乘以不同的系数,从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2,再将这17位数字和系数相乘的结果相加。
1*7+4*9+0*10+4*5+2*8+9*4+1*2+9*1+7*6+4*3+0*7+7*9+3*10+0*5+7*8+8*4+2*2=365
上面的结果除以11,得到一个余数。
365除以11余2。
根据余数对照表,由于余2,所以得到最终校验码是X。
余0,校验码为1
余1,校验码为0
余2,校验码为X
余3,校验码为9
余4,校验码为8
余5,校验码为7
余6,校验码为6
余7,校验码为5
余8,校验码为4
余9,校验码为3
余10,校验码为2
最终,王春花的身份证号码是14042919740730782X。
4. php随机生成身份证号码
写个脚本,方便娱乐。
require('xingming.php');
//init code
$content = file_get_contents('code.txt');
$content = explode("\n", $content);
$ar_info = [];
foreach($content as $val)
{
if(preg_match('/(\d+)\s+(\S+)/', $val, $matches))
{
$ar_info[] = array(trim($matches[1]), trim($matches[2]));
}
}
$info = $ar_info[mt_rand(0, count($ar_info) - 1)];
$code = $info[0];
$city = $info[1];
//init year
$birthday = mt_rand(mktime(0,0,0,1,1,1950), mktime(0,0,0,12,31,1992));
$birthday = date('Ymd',$birthday);
//init rand number
$suffix_a = mt_rand(0,9);
$suffix_b = mt_rand(0,9);
//sex, odd is male and even is female
$suffix_c = mt_rand(0,9);
$sex = $suffix_c % 2 == 1 ? '男' : '女';
//init shenfenzheng
$shenfenzheng = $code . $birthday . $suffix_a . $suffix_b . $suffix_c;
$ar_num = array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2);
$sum = 0;
for($i = 0; $i < 17; $i++)
{
$sum += substr($shenfenzheng, $i, 1) * $ar_num[$i];
}
$ar_fix = array(1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2);
$fix = $ar_fix[$sum % 11];
$shenfenzheng .= $fix;
echo "姓名: " . getName() . "<br/>";
echo "发证地: $city<br/>";
echo "出生日期: $birthday<br/>";
echo "性别: $sex<br/>";
echo "身份证: $shenfenzheng<br/>";
运行演示地址:
http://ranshy.com/shenfenzheng/
Leave a Reply