#!/usr/bin/perl # taiwanidchecksum -- 計算台灣國民身份證，居留證字號檢查號碼 # Compute Taiwan citizen and resident identification number checksums # Copyright : http://www.fsf.org/copyleft/gpl.html # Author : 積丹尼 Dan Jacobson -- http://jidanni.org/comp/checksums/ # Created On : Sun Jul 11 04:33:18 2004 # Last Modified On: Fri Sep 13 16:34:13 2013 # Update Count : 107 # 輸入：未冠檢號之身碼，一行一碼 # 輸出：有冠檢號之身碼 # Input: letter+number without checksum, one per line # Output: letter+number with checksum. 例 Example: # \$ taiwanidchecksum < 'all'; while (<>) { chomp; die "非未加檢查碼之身份證或居留證字號 Invalid data: \"\$_\"" unless /^[A-Z]([12][0-3]|[A-D]\d)\d{6}\$/; #12:男女,A-D居留證 my \$id = \$_; s/(.)([ABCD])(.*)/\$1 . ((ord \$2) - (ord 'A')) . \$3/e; my @A = reverse split '', index( '__________ABCDEFGHJKLMNPQRSTUVXYWZIO', ( substr \$_, 0, 1 ), 10 ) . substr \$_, 1; my \$total = pop @A; my \$i = 0; for (@A) { \$total += \$_ * ++\$i } printf "\$id%d\n", ( 10 - \$total % 10 ) % 10; } # 所有可能身碼總數為 One notes the maximum number of IDs is # print 26 * 2 * 4 * 10 ** 6; #=208,000,000, but # print 26 * 4 ... at least twice as many foreigners?!? # 參考如 reference http://zh.wikipedia.org/wiki/中華民國國民身分證