Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1923062
  • 博文数量: 167
  • 博客积分: 6641
  • 博客等级: 准将
  • 技术积分: 1976
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-02 11:49
文章存档

2020年(3)

2019年(6)

2017年(1)

2016年(3)

2015年(3)

2014年(8)

2013年(2)

2012年(12)

2011年(19)

2010年(10)

2009年(3)

2008年(17)

2007年(80)

分类: LINUX

2007-12-21 23:59:23

身份证号15位升18位的shell脚本[简化版]
 
###################### Start #######################
#!/bin/bash
###### by TsengYia#126.com 2007-12-21  http://selinux.cublog.cn ######
declare -r CHK_STR="10X98765432"      #//设置校验码字符串常量
declare -ra WI_ARRAY=(7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2)      #//设置加权因子数组常量
declare -i OLD_15_NUM ; read -p "Input 15bit ID-Card Number:" OLD_15_NUM      ##//读入键盘输入的15位身份证号
[ $? -ne 0 -o ${#OLD_15_NUM} -ne 15 ] && echo "Input error! Exit!!..." && exit 1      ##//作简单输入检查(位数、是否数字,不检查生日的合法性)
TMP_17_NUM=${OLD_15_NUM::6}"19"${OLD_15_NUM:6}      #//在第6、7位间插入"19",组合出身份证号17位本体码
i=0 ; SUM=0
while [ $i -lt 17 ] ; do
  let SUM+=$[${TMP_17_NUM:$i:1}*${WI_ARRAY[$i]}]      #//计算乘积和: SUM+=$[AI*WI]
let i++ ; done
NEW_18_NUM=${TMP_17_NUM}${CHK_STR:$[SUM%11]:1}      #//计算模数及校验码,组合出新的18位身份证号
echo "New 18bit ID-Card Number:$NEW_18_NUM"      #//列印新18位身份证号
 
###################### The End #######################
 
附:身份证校验码算法依据
 
以下内容来源于Internet网络
 
18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下:
一、范围
该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。
二、编码对象
公民身份号码的编码对象是具有中华人民共和国国籍的公民。
三、号码的结构和表示形式
1、号码的结构
公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
2、地址码
表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
3、出生日期码
表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
4、顺序码
表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
5、校验码
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
(2)计算模
Y = mod(S, 11)
(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
四、举例如下:
北京市朝阳区: 11010519491231002X
广东省汕头市: 440524198001010013
******************************************
附注:加权因子的计算规则
    计算2的n次幂对11取余,即为各位置的加权因子。公式为:Wi=MOD(POWER(2,n),11)
------------------------------------------------------------------
身份证本体码顺序号n:17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
身份证号码位置i:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
对应的加权因子Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
------------------------------------------------------------------
在上表中,
n 行的数字是计算加权因子用的参数(从右向左的17位本体码的顺序号)。
i 行的数字顺序就是身份证号码从左到右的顺序位置号。
Wi行的数字就是身份证号码从左到右对应的每个位置的加权因子。
阅读(1053) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~