Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Hive进行身份证合法性校验

Hive进行身份证合法性校验

作者头像
用户1148526
发布于 2019-05-25 11:47:27
发布于 2019-05-25 11:47:27
3.2K00
代码可运行
举报
文章被收录于专栏:Hadoop数据仓库Hadoop数据仓库
运行总次数:0
代码可运行

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1433241

身份证号码格式校验是很多系统在数据集成时的一个常见需求,我们以18位身份证为例,使用一个Hive查询实现身份证号码的合法性验证。该查询结果是所有不合规的身份证号码。按以下身份证号码的定义规则建立查询。

身份证18位分别代表的含义,从左到右方分别表示:

  • 1-2 省级行政区代码。
  • 3-4 地级行政区划分代码。
  • 5-6 县区行政区分代码。
  • 7-10 11-12 13-14 出生年、月、日。
  • 15-17 顺序码,同一地区同年、同月、同日出生人的编号,奇数是男性,偶数是女性。
  • 18 校验码,如果是0-9则用0-9表示,如果是10则用X(罗马数字10)表示。

身份证校验码的计算方法:

  1. 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
  2. 将这17位数字和系数相乘的结果相加。
  3. 用加出来和除以11,看余数是多少。
  4. 余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。

假设字段t.idcard存储身份证号码,Hive查询语句如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- Hive 18位身份证号码验证
select * from
(select trim(upper(idcard)) idcard from t) t1
 where -- 号码位数不正确
       length(idcard) <> 18 
       -- 省份代码不正确
       or substr(idcard,1,2) not in 
       ('11','12','13','14','15','21','22','23','31',
        '32','33','34','35','36','37','41','42','43',
        '44','45','46','50','51','52','53','54','61',
        '62','63','64','65','71','81','82','91') 
       -- 身份证号码的正则表达式判断
       or (if(pmod(cast(substr(idcard, 7, 4) as int),400) = 0 or
             (pmod(cast(substr(idcard, 7, 4) as int),100) <> 0 and 
              pmod(cast(substr(idcard, 7, 4) as int),4) = 0), -- 闰年 
           if(idcard regexp '^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9X]$',1,0),
           if(idcard regexp '^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9X]$',1,0))) = 0
       -- 校验位不正确
       or substr('10X98765432',pmod(
 (cast(substr(idcard,1,1) as int)+cast(substr(idcard,11,1) as int))*7
+(cast(substr(idcard,2,1) as int)+cast(substr(idcard,12,1) as int))*9
+(cast(substr(idcard,3,1) as int)+cast(substr(idcard,13,1) as int))*10
+(cast(substr(idcard,4,1) as int)+cast(substr(idcard,14,1) as int))*5
+(cast(substr(idcard,5,1) as int)+cast(substr(idcard,15,1) as int))*8
+(cast(substr(idcard,6,1) as int)+cast(substr(idcard,16,1) as int))*4
+(cast(substr(idcard,7,1) as int)+cast(substr(idcard,17,1) as int))*2
+cast(substr(idcard, 8,1) as int)*1
+cast(substr(idcard, 9,1) as int)*6
+cast(substr(idcard,10,1) as int)*3,11)+1,1) 
<> cast(substr(idcard,18,1) as int);

这条查询语句虽然有些复杂,但条理还是比较清楚的。子查询将字符串转为大写,并去掉左右两边的空格,外层查询的where条件筛选出四种不符合规则的身份证号码。首先判断号码长度和省份代码,然后利用Hive的正则表达式匹配函数对整个号码做逐位判断,最后检查校验位是否正确。各种违规条件之间使用or逻辑运算符,前面的条件一旦满足即可返回数据行,而不会再继续判断后面的条件。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年12月27日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
正则表达式 - 18位身份证号
        18位身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。其含义如下:
用户1148526
2023/04/28
1.4K0
身份证的校验规则
/* * 身份证15位编码规则:dddddd yymmdd xx p * dddddd:6位地区编码 * yymmdd: 出生年(两位年)月日,如:910215 * xx: 顺序编码,系统产生,无法确定 * p: 性别,奇数为男,偶数为女 * * 身份证18位编码规则:dddddd yyyymmdd xxx y * dddddd:6位地区编码
Happy、Liu
2019/04/24
2.7K0
二代身份证校验[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。百度一搜就能搜到很多身份证校验的例子,这个是最近做项目参考百度文库的demo修改后的 一,js:
全栈程序员站长
2022/09/14
1.5K0
校验身份证号码
之前在做项目的时候遇到了需要校验身份证号码,最初始的想法就是校验一下是否数字还有就是校验长度,后来想到有的身份证号的最末尾数字是X,于是又加入了一层判断末尾数为X的判断。
OECOM
2020/07/02
2.8K0
二代身份证号码验证器[超简单]
第十八位的数字是根据ISO 7064:1983.MOD 11-2校验码算法计算出来的
全栈程序员站长
2022/09/14
1.5K0
java验证身份证号码是否有效源代码
1、描述 用java语言判断身份证号码是否有效,地区码、出身年月、校验码等验证算法 2、源代码 package test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Hashtable;
代码伴一生
2021/09/19
1.2K0
二代身份证编码规则及校验代码实现
本文主要讨论的是二代身份证编码规则及其Java代码实现,下面的校验方式还不是特别严谨,由于只校验了前两位的省份信息,中间六位的出生日期信息和最后一位的校验码信息,故对于部分不满足要求的证件号码刚好同时满足了这里提到的几个条件,也会被判定为是合法的证件号码…
全栈程序员站长
2022/09/14
1.8K0
常用正则表达式
?提供日常开发中的一些js处理数据的方法,包括对数据的过滤,以及对数据的验证等。也希望大家能留下你好用的方法~~ 数据过滤 手机号码隐藏中间4位 保留两位小数 每三位逗号隔开,后面补两位小数,多用于
网罗开发
2021/07/21
1.8K0
身份证号码的正则表达式及验证详解(JavaScript,Regex)
在做用户实名验证时,常会用到身份证号码的正则表达式及校验方案。本文列举了两种验证方案,大家可以根据自己的项目实际情况,选择适合的方案。
毛瑞
2018/05/02
24.4K15
身份证号码的正则表达式及验证详解(JavaScript,Regex)
身份证号内容及校验方法
身份证号 区位代码6位+出生日期8位+随机码3位(男性奇数,女性偶数)+校验码1位,共计18位。
Yiiven
2022/12/15
1.1K0
56行Python代码实现身份证字典生成器
最近过生日,女朋友送了几本Python黑客编程的书(没错,小黑阔也是可以有女朋友的)。哈哈,皮一下就是很开心。
用户1631416
2018/12/13
10.4K0
揭开身份证验证的神秘面纱
正则验证身份证号码 HTML5学堂:曾经一直觉得用正则验证身份证号码是很简单的~但是,当真正挖掘身份证号码的规则之后,才发现,想要写好一个正则验证也没有那么容易。最近一周利利出差,所以,只能周六跟大家一起分享一下自己的研究结果啦~ 身份证的规则 书写一个正则之前,需要先了解一下身份证的基本规则 /* * 身份证18位编码规则:dddddd yyyymmdd xxx y * dddddd:6位地区编码 * yyyymmdd: 出生年(四位年)月日,如:19910215 * xxx:顺序编码,系统产生,无法确定
HTML5学堂
2018/03/12
1.9K0
身份证校验工具类IdcardUtils
package com.kaigejava.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map;   import org.apache.commons.lang.StringUtils; publ
凯哥Java
2019/06/30
2.6K0
PHP根据身份证号码验证、获取星座、生肖和性别函数
居民身份证,是用于证明持有人身份的一种法定证件,多由各国或地区政府发行予公民。并作为每个人重要的身份证明文件。首先介绍一下身份证含义 新的 18 位身份证号码各位的含义: 1-2 位省、自治区、直辖市代码; 3-4 位地级市、盟、自治州代码; 5-6 位县、县级市、区代码; 7-14 位出生年月日,比如 19670401 代表 1967 年 4 月 1 日; 15-17 位为顺序号,其中 17 位男为单数,女为双数; 18 位为校验码,0-9 和 X,由公式随机产生。 举例: 130503
沈唁
2018/05/24
2.7K0
身份证号校验规则
中国居民身份证号码编码规则 第一、二位表示省(自治区、直辖市、特别行政区)。 第三、四位表示市(地级市、自治州、盟及国家直辖市所属市辖区和县的汇总码)。其中,01-20,51-70表示省直辖市;21-50表示地区(自治州、盟)。 第五、六位表示县(市辖区、县级市、旗)。01-18表示市辖区或地区(自治州、盟)辖县级市;21-80表示县(旗);81-99表示省直辖县级市。 第七、十四位表示出生年月日(单数字月日左侧用0补齐)。其中年份用四位数字表示,年、月、日之间不用分隔符。例如:1981年05月11日就用19810511表示。 第十五、十七位表示顺序码。对同地区、同年、月、日出生的人员编定的顺序号。其中第十七位奇数分给男性,偶数分给女性。 第十八位表示校验码。作为尾号的校验码,是由号码编制单位按统一的公式计算出来的,校验码如果出现数字10,就用X来代替,详情参考下方计算方法。
超级小可爱
2023/02/20
2.8K0
身份证号码验证算法
做项目的时候需要对拿到的数据进行“清洗”,比如剔除一些不可能存在的身份证号码。查阅了网上的身份证号码验证算法,自己也总结一下。 (一)18身份证号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。  1、地址码  表示编码对象常住户口所在县(市、旗、区)的行政区域划分代码,按GB/T2260的规定执行。 2、出生日期码  表示编码对象出生的年、月、日,按GB/T74
似水的流年
2018/01/18
2.5K0
SQL Server 验证身份证合法性函数(使用VBScript.RegExp)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/53895680
用户1148526
2019/05/25
1.6K0
【Go】根据身份证(或生日)计算年龄
我们计算用户的年龄,当然只能根据用户的出生年月日信息来计算。这里我们定义:用户出生满1年后,年龄算1岁,不满1年算0岁,以此类推,大于1年不到2年算1岁。
后端码匠
2023/11/12
6980
PHP验证身份证格式
互联网公司对身份证验证的需求越来越多,然而普通的小公司是无法对接公安部门的身份认证系统的。几乎都是在网上买一些大的互联网公司的一些认证服务。即使是便宜一些的认证价格也达到了10万次/万元。也就是一角钱一次了,还是挺贵哈。所以为了减少公司的开支,我们在拿到用户提交的身份证信息去认证前应该自己先检验一下身份证的格式,如果连最基本的身份证格式就不满足的话,我们完全可以直接驳回,不必走接下来的花钱认证流程了,而且也可以建立一个用户身份证表,把每次认证通过的数据存起来,以后每次都先从自己系统里的用户身份证表查询,查不到再去走认证流程,最大化节省公司开支。
叫我可儿呀
2019/11/07
2.9K0
PHP验证身份证格式
JS身份证真实性验证
if (testId('320888888888888888') == false) { layer.msg("身份证号不正确!"); return false; } //身份证真实性验证 function testId(value) { var vcity = { 11: "北京", 12: "天津", 13: "河北", 14: "山西", 15: "内蒙古", 21: "辽宁", 22: "吉林", 23: "黑龙江", 31: "上海", 32
闻语博客
2021/01/21
2.6K0
相关推荐
正则表达式 - 18位身份证号
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验