PHP身份证校验和随机生成

0
250

之前由于需要一些身份证号码,要随机生成的,于是很仓促的写了几行。所以写出来的只能应急了,而且年月日也是分别随机出来的,号码的校验位啥的都没有校验直接是生成4位数的随机数。

这是之前写的年月日随机生成的代码,一看便知道这太不靠谱了,因为完全有可能出现19900231这样的出生年月。而顺序为、校验位也是一个随便的随机数,根本没有校验可言,所以生成的身份证号码99%是不合法的。

前几天偶然间有翻到一篇python 身份证校验的文章原文,于是乎,又动手重新写了一下。

先说点身份证的:

id-explain

一、身份证号码的组成

1、地址码(身份证号码前六位)

表示编码对象常住户口所在县(市、镇、区)的行政区划代码。1-2位省、自治区、直辖市代码; 3-4位地级市、盟、自治州代码; 5-6位县、县级市、区代码。关于行政区划代码具体的对应关系,可以从国家统计局网站上直接获取。具体地址为:http://www.stats.gov.cn/tjbz/xzqhdm/

2、生日期码(身份证号码第七位到第十四位)

表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。

3、顺序码(身份证号码第十五位到十七位)

地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。

4、校验码(身份证号码最后一位)

是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替。

二、身份证校验码计算方法

将前面的身份证号码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。通过上面得知如果余数是2,身份证的最后一位号码就是罗马数字x。如果余数是10,就会在身份证的第18位数字上出现的是2。

来看看最新的代码:

可以访问:随机生成100个ID

对于行政区域带代码自己可以到国家统计局获取,但是最新的数据有可能和以前的身份证区域代码不一致,原因是现在很多地方的区域重新划分所导致。

留言

留言不能为空
怎么称呼您?

验证码 *