这是给某机关单位写系统的时候要验证统一社会信用代码用的是PHP写的方法
java的话也是同理有时间我再把java代码贴出来,这就先贴PHP
JAVA统一社会信用代码算法解析验证(待更新)
JAVA身份z号算法解析验证(待更新)
PHP身份z号算法解析验证(点我点我)
统一社会信用代码算法解析: 其实整个算法只是为了对比最后一位数是否正确
1.声明一个数组(加权因子)以下是数组的元素 1,3, 9,27,19,26,16,17,20,29,25,13,8,24,10,30,28
2.声明一个0-9A-Z(权重) 没有I、O、S、V、Z的字符串变量str
3.对传进来的统一社会信用代码进行遍历
1).取传进来的统一社会信用代码第一位到第十七位循环取
2)在变量str中检索上面取到的元素值在str的位置下标
3)计算每一次权重与加权因子相乘之和
4.权重与加权因子相乘之和除以31求余,31再减去这个余数获得一个值
5.判断这个值是否等于31,如果相等将这个值重新赋值为0
6.声明一个0-9A-Z(权重) 没有I、O、S、V、Z 中间已",“隔开的字符串
7.以这个字符串按照”,"分割成数组 (其实可以直接声明成数组)
8.再以上面计算获取的值作为下标获取该数组中的一个元素
9.再获取传进来的统一社会信用代码的最后一位
10.判断统一社会信用代码的最后一位和从数组中获取的值进行对比,相等就是正确的,
这个方法传入统一社会编码就能用,
public function xinyongdaima($Code){ $patrn = "/^[0-9A-Z]+$/"; //18位校验及大写校验 if (strlen($Code)!= 18 || preg_match($patrn,$Code) == false) { return false; } else { $Ancode; //统一社会信用代码的每一个值 $Ancodevalue; //统一社会信用代码每一个值的权重 $total = 0; $weightedfactors = array(1,3, 9,27,19,26,16,17,20,29,25,13,8,24,10,30,28); //加权因子 $str = "0123456789ABCDEFGHJKLMNPQRTUWXY"; //不用I、O、S、V、Z for ($i = 0; $i < strlen($Code)-1; $i++) { $Ancode = substr($Code,$i, 1); if($Ancode=="I"||$Ancode=="O"||$Ancode=="S"||$Ancode=="Z"||$Ancode=="V"){ return false; } $Ancodevalue = strpos($str,$Ancode); $total = $total + $Ancodevalue * $weightedfactors[$i]; //权重与加权因子相乘之和 } $logiccheckcode = 31 - ($total % 31); if ($logiccheckcode == 31) { $logiccheckcode = 0; } $Str1 ="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y"; $Array_Str = split(",",$Str1); $logiccheckcode = $Array_Str[$logiccheckcode]; $checkcode = substr($Code,17, 18); if ($logiccheckcode != $checkcode) { return false; } else { } return true; } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)