IMEI第15位的生成算法SQL函数版

来源:互联网 发布:英语 伴读软件 编辑:程序博客网 时间:2024/05/15 01:06

参考:http://blog.csdn.net/linuxzhouying/article/details/8961617

首先感谢原文提供的思路,本文只针对算法做翻译。

算法说明:

===================================

------TAC------------ --FAC- ------SNR-----------
D14 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0
3 5 3 1 1 4 0 0 8 0 9 6 3 6 6
计算IMEI验证码的步骤:
1、把IMEI的奇数位数*2,如:D1,D3,D5,……D13
D13 D11 D9 D7 D5 D3 D1
10 2 8 0 0 12 12
2、将计算得到的7个奇数位数字分别以个位数相加(如果得到的是个两位数,则十位和个位分别当成个位数来相加),再加上7个偶数位数字,如:D2,D4,D6……D14
3+1+0+3+2+1+8+0+0+8+0+9+1+2+3+1+2=44
3、如果第2步计算得到的数字末位为0,则验证码数字为0。如果第2步计算结果末位数不是0,则以大于第2步计算结果的以0结尾的双位整数减去第2步的计算结果,所获得的个位数即为验证码。
D0 = 50 -44 =6

=====================================

为了在SQL SERVER中使用,通过 函数来实现此算法,稍做修改,位数从左到右,方法也反过来,即原由奇数位*2改变成偶数位*2


算法如下

Create function [dbo].[f_getIMEI](@IMEI14 varchar(14))    returns varchar(15)   as   begin  declare @IMEI15 varchar(15),@i intdeclare @v1 int,@v2 int,@v3 int,@v4 int,@v5 int,@v6 int,@v7 int,@v8 int,@v9 int,@v10 int,@v11 int,@v12 int,@v13 int,@v14 intselect @v1=cast(SUBSTRING(@IMEI14,1,1) as int)select @v2=cast(SUBSTRING(@IMEI14,2,1) as int)select @v3=cast(SUBSTRING(@IMEI14,3,1) as int)select @v4=cast(SUBSTRING(@IMEI14,4,1) as int)select @v5=cast(SUBSTRING(@IMEI14,5,1) as int)select @v6=cast(SUBSTRING(@IMEI14,6,1) as int)select @v7=cast(SUBSTRING(@IMEI14,7,1) as int)select @v8=cast(SUBSTRING(@IMEI14,8,1) as int)select @v9=cast(SUBSTRING(@IMEI14,9,1) as int)select @v10=cast(SUBSTRING(@IMEI14,10,1) as int)select @v11=cast(SUBSTRING(@IMEI14,11,1) as int)select @v12=cast(SUBSTRING(@IMEI14,12,1) as int)select @v13=cast(SUBSTRING(@IMEI14,13,1) as int)select @v14=cast(SUBSTRING(@IMEI14,14,1) as int)--偶数位*2select @v2=@v2*2select @v4=@v4*2select @v6=@v6*2select @v8=@v8*2select @v10=@v10*2select @v12=@v12*2select @v14=@v14*2--奇数位偶数位按位相加select @i=@v1+@v3+@v5+@v7+@v9+@v11+@v13+(@v2/10+@v2%10)+(@v4/10+@v4%10)+(@v6/10+@v6%10)+(@v8/10+@v8%10)+(@v10/10+@v10%10)+(@v12/10+@v12%10)+(@v14/10+@v14%10)--如果刚好尾数是0,即可被10整除,则第15位为0if @i%10=0select @IMEI15=@IMEI14+'0'elsebegin        --取个位数(模10取余),与10相减,所得数即为第15位select @i=10-@i%10select @IMEI15= @IMEI14+cast(@i as varchar)endreturn @IMEI15 endGO


原来打算用临时表或者物理表,但这些操作在函数中都是禁止的,最后就用这个最原始的方法给实现了~