JAVA、PHP统一社会信用代码、身份证号算法解析验证

PHP统一社会信用代码算法解析验证

统一社会信用代码算法解析: 其实整个算法只是为了对比最后一位数是否正确
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;
      }
	}

你可能感兴趣的:(PHP,php,算法)