1. 程式人生 > >Hive進行身份證合法性校驗

Hive進行身份證合法性校驗

  身份證號碼格式校驗是很多系統在資料整合時的一個常見需求,我們以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查詢語句如下:
-- 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邏輯運算子,前面的條件一旦滿足即可返回資料行,而不會再繼續判斷後面的條件。

相關推薦

Hive進行身份證合法性

  身份證號碼格式校驗是很多系統在資料整合時的一個常見需求,我們以18位身份證為例,使用一個Hive查詢實現身份證號碼的合法性驗證。該查詢結果是所有不合規的身份證號碼。按以下身份證號碼的定義規則建立查詢。  身份證18位分別代表的含義,從左到右方分別表示:1-2 省級行政區程

java身份證合法性並獲取並根據身份證號提取身份證相關資訊

原文地址:https://blog.csdn.net/ycb1689/article/details/52352147   /** * 身份證前6位【ABCDEF】為行政區劃數字程式碼(簡稱數字碼)說明(參考《GB/T 2260-2007 中華人民共和國行政區劃程式碼》): *

java 程式碼實現身份證合法性(全國所有地方)

很多地方可能都會用到對身份證要進行判斷校驗的功能,這個是之前在網上看到的,具體的網址都忘了,現在專案完成了,有時間把其整理下,方便自己和大家日後使用!(直接複製貼上即可) package org.asyware.insurance.util; import java.te

java身份證合法性

直接上程式碼,裡面有測試類/** * 身份證前6位【ABCDEF】為行政區劃數字程式碼(簡稱數字碼)說明(參考《GB/T 2260-2007 中華人民共和國行政區劃程式碼》): * 該數字碼的編制原則和結構分析,它採用三層六位層次碼結構,按層次分別表示我國各省(自治區,

Jquery身份證以及根據身份證自動寫入出生年月

spa ron and digi tro 號碼 hang code birt 效果圖: 根據身份證號自動寫入出生年月 身份證號碼校驗: js代碼部分: 1 $(function() { 2 jQuery.validator.addMethod("isI

為List<T>中的T進行參數

res ini obj ret name 請求 數據 參數綁定 $.ajax 1、現在前端發送了一個POST請求,他的Data是一個數組,而不是對象(jsonObj的值兩側是中括號)。 var jsonObj = [{‘id‘:11, ‘name‘:‘叵‘}, {‘id‘

java身份證號碼、郵箱、手機號碼/電話號碼

i++ start exceptio span cas table mail pub sys import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.

Jmeter接口測試通過SQL查詢進行數據

stp ima 分享 info turn return http catch object 在使用Jmeter做查詢類接口測試的時候,我們可以通過數據庫查詢結果與實際接口返回的結果進行數據校驗。 接口的返回值:{"PageResult":{"S

郵箱合法性(中軟國際機試)

題目描述     輸入一個電子郵箱地址字串,要求檢查這個郵箱地址是否合法。如果輸入的電子郵箱地址是合法的,輸出字串1,否則輸出字串0。     滿足如下條件被認為是合法的郵箱地址:     1、僅包含一個'@'字元     2、最後三個字元必須是'.com'     3、字

身份證碼計算

PS:倒數第二位奇數為男,偶數為女 (1)十七位數字本體碼加權求和公式  S = Sum(Ai * Wi), i = 0, … , 16 ,先對前17位數字的權求和  Ai:表示第i位置上的身份證號碼數字值  Wi:表示第i位置上的加權因子&n

Java——使用springboot2.0+kaptcha進行驗證碼

pom檔案 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/200

身份證號碼 java

最近在身份證認證的時候,需要對身份證號碼進行校驗。這裡進行記錄下 package com.ptpl.web.util; /**   * 身份證前6位【ABCDEF】為行政區劃數字程式碼(簡稱數字碼)說明(參考《GB/T 2260-2007 中華人民共和國行政區劃程式碼》)

Java使用luhn演算法實現銀行卡號合法性&&獲取銀行卡號所屬銀行

Luhn校驗演算法或是Luhn 公式,也被稱作“模10演算法”。它是一種簡單的校驗公式,一般會被用於身份證號碼,IMEI號碼,美國供應商識別號碼, 或是加拿大的社會保險號碼的驗證。該演算法是由IBM的科學家Hans Peter Luhn所創造,於1954年1月6日提出該

Excel自定義函式_身份證號碼

先上校驗規則 身份證號碼校驗規則一般應有: 位數校驗:是否18位 性別校驗:號碼所反映的性別與登記的文字性別是否一樣 日期校驗:①年份 出生年份比當前系統年份晚為錯,早於100也記為錯,應核實;②月份數值 應在01-12之間;③日期數值 1/3/5/7/8/10/12

Ajax結合SpringMVC進行使用者名稱非同步

1. JSP程式碼: <script> function checkName(){ var name=document.getElementBy

身份證正確性

驗證身份證的有效性,是否符合身份證規範 /** * 功能:身份證的有效驗證 * @param IDStr 身份證號 * @return 有效:返回"true" ;無效:返回String資訊 * @throws P

Java實現身份證演算法

每一個身份證號碼,都不是胡亂隨機生成的,而是按照國家的規定,有規則的生成的,具體規則點選這裡檢視。我們校驗使用者的身份證輸入,僅靠簡單的位數判斷、正則校驗是達不到測試要求的,因此就需要根據國家的規定,把身份證的生成規則轉變為演算法,通過演算法來校驗使用者的輸入是

對前臺傳過來的實體是否為空 進行為空的N種方法

common 編譯 response spl rst maps 校驗 mod 維護 首先定義一個註解,如下 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; im

超完整、全面的身份證號碼

/** * identityCardVerify:身份證校驗 * param:cardId==身份證元素id */var identityCardVerify= function (cardId) {    var vcity = {        11: "北京", 12:

vue-----使用eslint進行代碼

fix filesize vue mic form -o 兩個 編輯 shu 參考 https://www.jianshu.com/p/dc799008bc68 現在很多程序員寫代碼的時候都喜歡開著eslint進行代碼格式校驗,寫習慣了還好,但是