1. 程式人生 > >18位身份證號藏了什麼玄機?用js教你校驗身份證

18位身份證號藏了什麼玄機?用js教你校驗身份證

大家好,想必各位程式猿已經有所發現,而相應地,在日常的開發任務需求了很多跟涉及到使用者的都幾乎需要用到身份證的校驗,因此不留君特意整理出一份身份證號的組成原理以及

校驗函式(js版)

【身份證號碼的規則】

6位地方程式碼+8位出生年月日數字+2位順序碼+1位性別程式碼+1位校驗碼

1)地方程式碼:

地方程式碼的前兩位由特定的省份程式碼組成,至於原理呢...沒有,我們並不需要糾結或者記住來源,只需要校驗輸入身份證號中的前兩位是否在這些省份程式碼裡即可

{

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:"國外 "};

於是我們可以定義一個省份程式碼陣列,並且編寫一個校驗前兩位的函式:

var checkCityNoIsOk=function (cityNo) {

        var provinceCodeArr = [

         "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"

         ];

        for (var i = 0; i < provinceCodeArr.length; i++) {

            if (cityNo == provinceCodeArr[i]) {

                return true;

            }

        }

        return false;

    }

有了這個函式,地方程式碼的校驗就妥妥的了,網友可能會疑惑,地方程式碼不是6位嗎,為什麼只校驗前兩位就可以了呢?別急,先走下一個環節

2)出生年月日

出生年月日沒什麼玄機的,只要校驗出年月日是標準的年月日即可,於是我們可以建立一個函式來校驗年月日的,如下

var checkBirthIsOk=function(year,month,day){

try{

    //獲取年齡

var age = Math.round( (nowdate - bir) / (365 * 24 * 60 * 60 * 1000));

if(age>=18){

  return true;

}

}

catch(e){

//一切不標準的年月日都會丟擲異常

return false;

}

return false;

}

程式碼中有18歲的校驗,是因為以前的要求是成年人才有身份證,現在貌似一出生就有身份證號了,如果真是這樣,則把18歲的判斷限制去掉即可。

3)順序碼:

表示在同一省份程式碼所標識的區域範圍內,對同年同月同日出生的人編定的順序號,順序碼的奇數為男,偶數為女

4)校驗碼:

校驗碼是根據前面17位數字碼,按照ISO 7064:1983.MOD 11-2校驗碼計算出來的檢驗碼

算出來的校驗碼範圍為1-10但是如果是10為了遵循18位身份證號的規則,就得用X來替代10,這就解釋了為什麼

有些身份證號碼最後一位是X

校驗碼的規則是:

1.身份證的前17位,每一位乘以一個相應的加權因子

他們對應的因子為[7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]

2.得出新的17位數相加。

3.用加出來和除以11求餘數

4.餘數對應校驗表[1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2],其中10展現為X

5.得到餘數對應校驗表。比如餘數是0則結果1  餘數是4結果是9...

於是我們可以建立一個函式來校驗:

var checkFactorIsOk=function(idCardNo){

   var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];// 加權因子

       var checktable = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];// 校驗值對應表

       var checksum = 0;

       var befor17 = idCardNo.substr(0, 17);

       for (var i = 0; i < 17; i++) {

             var num = parseInt(befor17.substr(i, 1)) * factor[i];

             checksum += num;

            }

        //結果求餘

       var yushu = checksum % 11;

       // 餘數只可能有0 1 2 3 4 5 6 7 8 9 10這11個數字

       if (yushu > 10) {

           return false;

         }

       var s = checktable[yushu];

       var checkNoStr = idCardNo.substr(17, 1);

       if (checkNoStr) {

          // 如果是“X”或者“x” 第二位 則只能對應 對應表的 10

          if (checkNoStr == "X" || checkNoStr == "X") {

              if (s == 10) {

                  return true;

                } else {

                  return false;

                  }

                }

                // 如果不是字母,則最後一位分別對應 對應表 即可

           else if (parseInt(checkNoStr) == s) {

                     return true;

                  } else {

                     return false;

                 }

         }                         

}

最終完整的程式碼如下:

var checkIdCardIsOk = function (idcardNo) {

    //校驗省份程式碼

    var checkCityNoIsOk = function (cityNo) {

        var provinceCodeArr = [

            "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"

        ];

        for (var i = 0; i < provinceCodeArr.length; i++) {

            if (cityNo == provinceCodeArr[i]) {

                return true;

            }

        }

        return false;

    }

//校驗出生日期

    var checkBirthIsOk = function (year, month, day) {

        try {

            //獲取年齡

            var nowdate=new Date();

            var bir = new Date(bstr.substring(0, 4), bstr.substring(4, 6), bstr.substring(6, 8));

            var age = Math.round((nowdate - bir) / (365 * 24 * 60 * 60 * 1000));

            if (age >= 18) {

                return true;

            }

        }

        catch (e) {

            //一切不標準的年月日都會丟擲異常

            return false;

        }

        return false;

    }

//校驗順序碼和校驗碼

    var checkFactorIsOk = function (idCardNo) {

        var factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];// 加權因子

        var checktable = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];// 校驗值對應表

        var checksum = 0;

        var befor17 = idCardNo.substr(0, 17);

        for (var i = 0; i < 17; i++) {

            var num = parseInt(befor17.substr(i, 1)) * factor[i];

            checksum += num;

        }

        //結果求餘

        var yushu = checksum % 11;

        // 餘數只可能有0 1 2 3 4 5 6 7 8 9 10這11個數字

相關推薦

18身份證什麼玄機js身份證

大家好,想必各位程式猿已經有所發現,而相應地,在日常的開發任務需求了很多跟涉及到使用者的都幾乎需

【虛擬走路】微信運動刷步公眾更新什麽刷步數

tro 微信 每天 搜索 需求 HR strong ron jsb 大家都知道微信運動可以記錄我們每天的步行數據,但是我們想知道這個數據能否通過技術手段進行作弊呢? 之前我們知道有一個黑科技公眾號【虛擬走路】,可以對微信運動數據進行輕松修改。 但是後來因為種種原因這個公眾號

JS身份證號碼(1518)

//檢查生日是否正確 checkBirthday = function(card) { var len = card.length; //身份證15位時,次序為省(3位)市(3位)年(2位)月(2位)日(2位)校驗位(3位),皆為數字 if(len == '15') { var re_fifteen = /^

【小家java】Java中的執行緒池,真的嗎?(正確的姿勢使用執行緒池)

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

js 身份證

根據地區編碼、身份證格式、18位身份證需要驗證最後一位校驗位   //校驗身份證 function IdentityCodeValid(code) { var city = { 11: "北京", 12: "天津",

JS嚴格身份證

以下是根據身份證號碼編碼規則,使用JS對其進行有效性驗證程式碼<script type="text/javascript"> var Wi = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 ];

正則表示式身份證

最近在看正則表示式的一些東西,突然想起之前寫的一個關於身份證號碼校驗的小程式。當時寫身份證的校驗的時候,沒有考慮到輸入格式的校驗。程式的健壯性很差,現在我就用正則表示式來做身份證格式校驗,體驗一下正則表示式的奇妙用法。 正則表示式是對字串操作的一種邏輯公式,就

來遲Python助疊貓貓,搶618大紅包!

目錄: 0 引言 1 環境 2 需求分析 3 前置準備 4 逛店鋪流程回顧 5 程式碼全景展示 6 總結 0 引言 最近疊貓貓的活

身份證有效性

blog fun for return 計算 base == arch 特殊 1 /** 2 * 驗證身份證格式有效性 3 * @param type $id_card 4 * @return boolean 5 */ 6 function valid

【struts2+hibernate+spring項目實戰】戶登錄(struts攔截器)

exceptio work 崩潰 pack 所有 obj pac com cti 一、概述 項目中所有頁面均放入WEB-INF,所有頁面安全性得到了很大程度的提高。但是當用戶登錄後長時間沒有操作時,會造成Session數據的過期,如果此時獲取Session中的數據,必定會引

戶名和密碼程序

提示 用戶名 pass true () brush inpu highlight print name = input(‘請輸入用戶名:‘) password = input(‘請輸入密碼:‘) if 6 <= len(name) <= 20: pri

簡單易的參數北京PK10平臺出租和版本校方式(java)

else runtime boot java pri conf utils 短信 con 步驟是:配置數據校驗規則(多條)>>>>在控制器上添加校驗註解>>>>使用攔截器攔截校驗參數(獲取註解,初始化校驗規則(第一次),取出參

一個完整身份證

一個完整校驗身份證 /** * 校驗身份證號合法性 */ function checkIdNumberValid(tex){ var tip = '輸入的身份證號有誤,請檢查後重新輸入!'; var num = tex.value; num = num.toUpperCase()

python3任意Html主內容提取

騰訊DeepOcean原創文章:dopro.io/pymainhtml.… 筆者上一篇文章我們講到了如何“從零開始造一個智障機器人”,如果感興趣的朋友可以看一看。本文可以說是上一篇文章的前傳,為造聊天機器人而打基礎。 上篇文章中的對話機器人,其一問一答還是挺流暢的,那麼我們不禁思考,

身份證號碼

校驗身份證是否正確,必須是二代身份證,身份證號是18位 /** * 驗證18位身份編碼是否合法 * * @param idCard 身份編碼 * @return 是否合法 */ public static boolean val

右鍵Git Bash Here不見怎麼辦,手把手還原!

第一步,window + R,輸入regedit回車進入登錄檔 依次進入HKEY_CLASSES_ROOT —-》 Directory —-》Background —-》 shell 右鍵點選shell,選擇新建,然後選擇項,命名為 Git Bash Here,成功後進入桌面右鍵發現多了 Git B

手機簡訊刪除怎麼恢復?簡單恢復簡訊

  手機簡訊刪除了怎麼恢復?隨著現在的手機融入我們的生活當中,雖然現在都不會怎麼使用手機發簡訊了,但是還是會有些許的人會使用手機給別人傳送簡訊,手機簡訊可以一直留存在手機裡面,還可以留在電話卡里面。那麼如果手機簡訊刪除怎麼恢復?   手機簡訊也很容易被刪除,如果我們手機裡面的簡訊被刪除了該怎麼辦

身份證是否正確

package com.gc.action; public class Test {     public static void main(String[] args) {         String

初識區塊鏈——JS構建自己的區塊鏈

前言 區塊鏈太複雜,那我們就講點簡單的。用JS來構建你自己的區塊鏈系統,寥寥幾行程式碼就可以說明區塊鏈的底層資料結構、POW挖礦思想和交易過程等。當然了,真實的場景遠遠遠比這複雜。本文的目的僅限於讓大家初步瞭解、初步認識區塊鏈。 文章內容主要參考視訊:Building a bloc

Python微信防撤回(文字、圖片、語音、視訊、名片等...)

大家在使用微信過程中,有時候訊息還沒看到,就被撤回了。畢竟好奇心大家都有,明知到訊息被撤回了,就更想去看一下是什麼內容心裡想著萬一是女神給我表白了呢.. 今天就用Python來做個微信防撤回的小功能。支援文字、圖片、語音、視訊、名片的防撤回。 思路:利用itchat庫將每次接收到的訊息進行快取。監