JS前后端實(shí)現(xiàn)身份證號驗(yàn)證代碼解析
前言
實(shí)名制是許多網(wǎng)站都必備的功能,因此用戶經(jīng)常需要輸入身份證號,但是我們無法連通公安局的數(shù)據(jù)庫進(jìn)行驗(yàn)證身份證和姓名地址是否匹配,因此可以根據(jù)身份證生成的規(guī)則來進(jìn)行身份證格式的驗(yàn)證,以下僅介紹二代身份證的驗(yàn)證。
計(jì)算公式
公民身份號碼是特征組合碼,由十七位數(shù)字本體碼和一位校驗(yàn)碼組成。
排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一位校驗(yàn)碼。
1、地址碼:表示編碼對象常住戶口所在縣(市、旗、區(qū))的行政區(qū)域劃分代碼,按GB/T2260的規(guī)定執(zhí)行。
2、出生日期碼:表示編碼對象出生的年、月、日,按GB/T7408的規(guī)定執(zhí)行,年、月、日代碼之間不用分隔符。
3、順序碼:表示在同一地址碼所標(biāo)識的區(qū)域范圍內(nèi),對同年、同月、同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。
4、校驗(yàn)碼計(jì)算步驟:
(1)十七位數(shù)字本體碼加權(quán)求和公式:
S = Sum(Ai * Wi), i = 0, … , 16 ,先對前17位數(shù)字的權(quán)求和;
Ai:表示第i位置上的身份證號碼數(shù)字值(0~9);
Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 (表示第i位置上的加權(quán)因子);
(2)計(jì)算模:Y = mod(S, 11);
(3)根據(jù)模,查找得到對應(yīng)的校驗(yàn)碼:Y: 0 1 2 3 4 5 6 7 8 9 10 校驗(yàn)碼: 1 0 X 9 8 7 6 5 4 3 2;
前端驗(yàn)證
const weight = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2];//十七位數(shù)字本體碼權(quán)重 const validate = ['1','0','X','9','8','7','6','5','4','3','2'];//mod11,對應(yīng)校驗(yàn)碼字符值 function getValidateCode(id17){ let sum = 0; let mode = 0; [...id17].forEach((elem,i) => { sum=sum+parseInt(elem)*weight[i]; }); mode = sum % 11; return validate[mode]; } console.log("該身份證驗(yàn)證碼:"+ getValidateCode("14230219700101101"));//該身份證驗(yàn)證碼:3
后端驗(yàn)證(Java)
public class Id18 { int[] weight={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};//十七位數(shù)字本體碼權(quán)重 char[] validate={ '1','0','X','9','8','7','6','5','4','3','2'};//mod11,對應(yīng)校驗(yàn)碼字符值 public char getValidateCode(String id17){ int sum = 0; int mode = 0; for(int i = 0; i < id17.length(); i++){ sum=sum+Integer.parseInt(String.valueOf(id17.charAt(i)))*weight[i]; } mode = sum % 11; return validate[mode]; } public static void main(String[] args){ Id18 tes t= new Id18(); System.out.println("該身份證驗(yàn)證碼:"+test.getValidateCode("14230219700101101"));//該身份證校驗(yàn)碼:3 } }
總結(jié)
身份證驗(yàn)證和手機(jī)號郵箱等格式驗(yàn)證是一樣的,都要做前后端雙重驗(yàn)證,前端驗(yàn)證不通過就不勞煩后端驗(yàn)證,減輕服務(wù)器的壓力;
至于一代身份證的驗(yàn)證大家也可以查詢下相關(guān)的算法,在原基礎(chǔ)上改改即可,我感覺現(xiàn)在好像也沒有一代身份證了,亦或者用一代身份證的人都不怎么上網(wǎng),因此這里就不寫了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
js獲取兩個(gè)數(shù)組對象的差集實(shí)現(xiàn)方法
這篇文章主要為大家介紹了js獲取兩個(gè)數(shù)組對象的差集實(shí)現(xiàn)方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08類似php的js數(shù)組的in_array函數(shù)自定義方法
PHP的數(shù)組函數(shù)in_array()非常方便,下面就為大家介紹下自定義類似php的js數(shù)組的in_array函數(shù),具體實(shí)現(xiàn)方法如下,感興趣的朋友可以參考下2013-12-12JavaScript數(shù)組及常見操作方法小結(jié)
這篇文章主要介紹了JavaScript數(shù)組及常見操作方法,結(jié)合實(shí)例形式總結(jié)分析了JavaScript數(shù)組的基本獲取、添加、刪除、排序、翻轉(zhuǎn)等相關(guān)操作技巧,需要的朋友可以參考下2019-11-11關(guān)于Iframe父頁面與子頁面之間的相互調(diào)用
下面小編就為大家?guī)硪黄P(guān)于Iframe父頁面與子頁面之間的相互調(diào)用。小編覺得挺不錯(cuò)的,希望對大家有所幫助。一起跟隨小編過來看看吧,祝大家游戲愉快哦2016-11-11JS函數(shù)(普通函數(shù),箭頭函數(shù))中this的指向問題詳解
這篇文章主要給大家介紹了JS中普通函數(shù)和箭頭函數(shù)的this指向,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09