首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 實作中國身份證驗證(符合 GB11643-1999 標準)

     編輯:關於C語言

前言

本文介紹如何使用 C# 實作中國大陸居民身份證號碼的驗證邏輯,包含地區碼校驗、出生日期校驗以及最後一位檢驗碼的計算,完整符合 GB11643-1999《公民身份號碼》國家標準。

身份證號碼結構

根據標準,身份證號碼分為 15 位(舊版)與 18 位(新版)兩種格式:

  • 15 位:6 位地區碼 + 6 位出生日期 (YYMMDD) + 3 位順序碼
  • 18 位:6 位地區碼 + 8 位出生日期 (YYYYMMDD) + 3 位順序碼 + 1 位檢驗碼

地區碼對照表(前兩位)

各省、直轄市、自治區及特區的前兩位代碼如下:

地區代碼地區代碼地區代碼
北京11吉林22福建35
廣東44雲南53天津12
黑龍江23江西36廣西45
西藏54河北13上海31
山東37海南46陝西61
山西14江蘇32河南41
重慶50甘肅62內蒙古15
浙江33湖北42四川51
青海63遼寧21安徽34
湖南43貴州52寧夏64
新疆65台灣71香港81
澳門82國外91

檢驗碼計算演算法(18 位)

  1. 加權求和:對前 17 位數字本體碼,依權重因子 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 進行加權求和
    公式:S = Σ (Ai × Wi), i = 0..16
  2. 取模 11:Y = S mod 11
  3. 對應檢驗碼:
Y 值012345678910
檢驗碼10X98765432

程式碼實作範例

public static bool ValidateIdCard(string idCard)
{
    if (string.IsNullOrEmpty(idCard)) return false;
    
    // 15 位轉 18 位邏輯略...
    if (idCard.Length == 18)
    {
        // 地區碼檢查
        string region = idCard.Substring(0, 2);
        if (!ValidRegions.Contains(region)) return false;
        
        // 出生日期檢查
        if (!DateTime.TryParseExact(idCard.Substring(6, 8), "yyyyMMdd", null, DateTimeStyles.None, out _))
            return false;
        
        // 檢驗碼計算
        int[] weights = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
        char[] checkCodes = {'1','0','X','9','8','7','6','5','4','3','2'};
        int sum = 0;
        for (int i = 0; i < 17; i++)
        {
            if (!int.TryParse(idCard[i].ToString(), out int digit)) return false;
            sum += digit * weights[i];
        }
        char expected = checkCodes[sum % 11];
        return char.ToUpper(idCard[17]) == expected;
    }
    return false;
}

總結

透過嚴格遵循 GB11643-1999 標準,結合地區碼、日期合法性及檢驗碼演算法,即可可靠驗證中國身份證號碼。實際專案中建議封裝為工具類,並針對 15 位舊版號碼提供自動升級轉換功能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved