ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript で ID カード認証コードを実装_JavaScript スキル

JavaScript で ID カード認証コードを実装_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 15:15:181200ブラウズ

18桁の各ID番号の意味

1 ~ 2 桁の州、自治区、または市区町村コード
3 ~ 4 桁の都道府県レベルの市、リーグ、自治県コード
5 ~ 6 桁の郡、郡レベルの都市、地区コード
7 ~ 14 桁の生年月日。たとえば、19670401 は 1967 年 4 月 1 日を表します。 15 ~ 17 桁はシーケンス番号で、そのうち 17 桁は男性の場合は奇数、女性の場合は偶数です。 18 桁はチェック コード、0 ~ 9 および X で、式によってランダムに生成されます。
例:

340523 1980 0101 0013 この ID 番号の意味:
34は安徽省

05は馬鞍山市

23は何県です
19800101 は生年月日 (1980 年 1 月 1 日)
001 はシーケンス番号 (1 は男性を表す奇数)
3 は確認コードです

行政区画コード

郡以上の最新の行政区画コード (2014 年 10 月 31 日現在)

北京市 (110000 BJ)

天津市 (120000 TJ)

河北省 (130000 HE)

山西省 (140000 SX)
内モンゴル自治区 (150000 NM)
遼寧省 (210000 LN)
吉林省 (220000 JL)
黒竜江省 (230000 HL)
上海 (310000 SH)
江蘇省 (320000 JS)
浙江省 (330000 ZJ)
安徽省 (340000 AH)
福建省 (350000 FJ)
江西省 (360000 JX)
山東省 (370000 SD)
河南省 (410,000 HA)
湖北省 (420000 HB)
湖南省 (430000 HN)
広東省 (440,000 GD)
広西チワン族自治区 (450000 GX)
海南省 (460000 HI)
重慶市 (500000 CQ)
四川省 (510000 SC)
貴州省 (520000 GZ)
雲南省 (530000 円)
チベット自治区 (540000 XZ)
陝西省 (610000 SN)
甘粛省 (620000 GS)
青海省 (630000 QH)
寧夏回族自治区 (640000 NX)
新疆ウイグル自治区 (650000 XJ)
台湾省 (710000 Tw)
香港特別行政区 (810000 HK)
マカオ特別行政区 (820000 月)

IDカードの18桁目(チェックコード)の計算方法
ID 番号の最初の 17 桁にさまざまな係数を掛けます。

1 位から 17 位までの係数は次のとおりです: 7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2

これらの 17 桁の数値と係数を乗算した結果を加算します。
合計を 11 で割って余りを確認します。
残りは 11 個の数字のみです: 0-1-2-3-4-5-6-7-8-9-10; 対応する最後の ID 番号は 1-0-X-9-8-7-6-5-4-3-2
です。 上記のことから、余りが 2 の場合、ID カードの 18 桁目にローマ数字 X が表示されることがわかります。余りが 10 の場合、ID カードの最後の番号は 2 になります。
例:
ある男性のID番号は340523198001010013です。この ID カードが合法的な ID カードであるかどうかを確認する必要があります。

まず、最初の 17 桁の積の合計を取得します。
(3*7+4*9+0*10+5*5+2*8+3*4+1*2+9*1+8*6+0*3+0*7+1*9+0 *10+1*5+0*8+0*4+1*2) = 185
次に、残りを要求します:

185 % 11 = 9

最後に、対応するルールを通じて、余り 9 に対応する数値が 3 であることがわかります。したがって、これは適格な ID 番号であると判断できます。


18 桁の ID カードを検証するための JavaScript


コードをコピー

最初に桁数が 18 桁であるかどうかを確認します:

次に、最初の 2 桁が法的な州 (市/自治区) であるかどうかを確認します。

if(!/^\d{17}(\d|x)$/i.test(ID)) return false;
// \d  匹配数字
// ^  匹配开始
// $  匹配结尾
// i  不区分大小写
// {17} 匹配17次
// \d|x 匹配数字或x

// stringObject.substr(start,length) メソッドは、文字列

の開始添字から始まる指定された数の文字を抽出できます。 // オブジェクトのプロパティにアクセスするときにドット (.) 構文を使用することに加えて、角括弧 ([]) を使用することもできます。
if(city[ID.substr(0,2)] === undefined) return "非法地区";
次に、生年月日が合法かどうかを確認します。



最終的にチェックコードが正しいかどうかを判断します:

var birthday = ID.substr(6, 4) + '/' + Number(ID.substr(10, 2)) + '/' + Number(ID.substr(12, 2));
var d = new Date(birthday);
var newBirthday = d.getFullYear() + '/' + Number(d.getMonth() + 1) + '/' + Number(d.getDate());
var currentTime = new Date().getTime();
var time = d.getTime();
if(time >= currentTime || birthday !== newBirthday) return '非法生日';
// 获取身份证的年月日,然后再 new 一个 Date,再对比这两个日期是否一致
// 这里用Number()主要是因为身份证的日期是带0的,而new Date()出来的日期是不带0的,Number()之后就都不带0了

上記の検証に合格した場合、それは有効な ID 番号です。

完全なコード
var arrInt = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
var arrCh = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
var sum = 0, i, residue;
for(i=0; i<17; i++) {
 sum += ID.substr(i, 1) * arrInt[i];
}
residue = arrCh[sum % 11];
if (residue !== ID.substr(17, 1)) '非法证号';


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。