首页 > 编程知识 正文

身份证尾数校验码,身份证末尾校验码

时间:2023-05-04 14:39:14 阅读:260390 作者:2720

在先前数据模拟一文中,我们谈到了身份证号的尾数校验。

身份证尾数就是第十八位数的校验码。计算方法是将身份证前十七位数分别乘以不同系数,7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2,再把相乘的结果相加,和除以11,看看余数是多少。余数只可能有0、1、2、3、4、5、6、7、8、9、10这十一个数字,其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2,这样就得出了第二代身份证第十八位数的校验码。

不过当时为了生成数据的简便性,并没有用上,而是采取了随机。现在就把它完善下,用的是上次生成的身份证号数据。

大致思路就是,提取原身份证号的前17位数,并逐个拆分。比如上面的32万条数据,可拆成一个320000 X 17的矩阵。然后利用矩阵乘法,按上面校验位的定义进行计算,求余数,再换成对应的字符,最后和原来的前17位拼接起来,形成最新且正确的身份证号码。



新的身份证号码除了最后一位(正确的校验数),跟原来的是一模一样的。
最后我们来简单回顾一下,本次任务非常明确,跟着定义一步一步算即可,只是计算这里有个坑需要注意,本来是打算逐行循环,即一个原身份证号计算一次校验位,效率低到不忍直视,果断放弃,改用矩阵计算,除了一个charcter 化 numbric的小问题,几乎秒秒钟搞定。
像R这样的语言,对于数量庞大的计算,能用向量/矩阵尽量用,循环效率是很低的。

参考代码:

#身份证号补充,校验位data<-read.xlsx('C:/Users/Administrator/Desktop/各省会员/河南.xlsx')yid<-data$身份证号码bid<-matrix(320000,17)for (i in 1:17) { bid[,i]<-str_sub(yid,i,i)}test2<-matrix(as.numeric(bid),320000,17) xx<-c(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2)tt<-matrix(xx,17)rr<-test2 %*% ttrr1<-as.numeric(rr) %% 11r11<-data.frame(c(1:320000),rr1)colnames(r11)<-c('序号','余数')weishu<-read.xlsx('C:/Users/Administrator/Desktop/尾数.xlsx')newdata<-merge(r11,weishu,by='余数',all.x=T)n<-newdata[order(newdata$序号),]saved<-str_sub(yid,1,17)newid<-str_c(saved,n$尾数)kk<-data.frame(yid,newid)colnames(kk)<-c('原id','新id')

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。