18位身份证校验算法

身份证校验码算法
身份证校验码产生方法:
∑(ai×Wi)(mod 11)

i: 表示号码字符从由至左包括校验码在内的位置序号;

ai 表示第i位置上的号码字符值;

Wi 第i位置上的加权因子,其数值Wi=mod(power(2,(n-1)),11)

i 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Wi 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2 1

相应的校验码:
∑(ai×WI)(mod 11) 0 1 2 3 4 5 6 7 8 9 10
校验码字符值ai 1 0 X 9 8 7 6 5 4 3 2


 

  1. create or replace function ID_15to18(idCardNum varchar2) return varchar2 is
  2.   Result varchar2(20);
  3.   i      smallint;
  4.   num    smallint := 0;
  5.   sNum   varchar2(2);
  6.   code   char(1);
  7.   temp17 varchar2(20);
  8. begin
  9.   if length(idCardNum) = 18 or idCardNum is null then
  10.     Result := upper(idCardNum);
  11.   elsif length(idCardNum) = 15 then
  12.     temp17 := substr(idCardNum, 1, 6) || '19' || substr(idCardNum, 7, 9);
  13.     i      := 18;
  14.   
  15.     while i > 1 loop
  16.       num := num + mod(power(2, i - 1), 11) * substr(temp17, 19 - i, 1);
  17.       i   := i - 1;
  18.     end loop;
  19.   
  20.     num := mod(num, 11);
  21.   
  22.     sNum := num || '';
  23.     if num = 0 then
  24.       code := '1';
  25.     elsif num = 1 then
  26.       code := '0';
  27.     elsif num = 2 then
  28.       code := 'X';
  29.     else
  30.       code := (12 - num) || '';
  31.     end if;
  32.     Result := temp17 || code;
  33.   else
  34.     Result := idCardNum;
  35.   end if;
  36.   return Result;
  37. exception
  38.   when others then
  39.     dbms_output.put_line('ERROE'||idCardNum);
  40.   
  41. end ID_15to18;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值