JAVA实现社会统一信用代码校验的方法

  

网上找了几个,写的都不太适合,有的写出来了,也没有给出参考的算法链接。这样就导致了如果产生错误我们无法排查(不懂原理怎么排查对吧)。

  

如果在使用过程中有疑虑,请参考:较验规则
  

        包com.mengyunzhi.common.utils;      进口org.apache.commons.collections4.BidiMap;   进口org.apache.commons.collections4.bidimap.TreeBidiMap;   进口org.slf4j.Logger;   进口org.slf4j.LoggerFactory;      进口javax.validation.ValidationException;   进口java.util.Map;   进口java.util.Random;/* *   *统一社会停用用代码   */公共接口UnifiedCreditCodeUtils {   日志记录器=LoggerFactory.getLogger (UnifiedCreditCodeUtils.class);   字符串baseCode=?123456789 abcdefghjklmnpqrtuwxy”;   char [] baseCodeArray=baseCode.toCharArray ();   int [] wi={1、3、9日27日,19日,26日,16日,17日,20日,29日,25日,13日,8日,24日,10日,30日,28日};/* *   *生成供较验使用地图的代码   *   * @return BidiMap   */Integer>静态BidiMap<角色;generateCodes () {   Integer> BidiMap<角色;代码=new TreeBidiMap<在();   for (int i=0;我& lt;baseCode.length ();我+ +){   代码。put (baseCodeArray[我],我);   }      返回码;   }/* *   *较验社会统一信用代码   *   * @param unifiedCreditCode统一社会信息代码   * @return符合:没错   */静态布尔validateUnifiedCreditCode(字符串unifiedCreditCode) {   如果((unifiedCreditCode.equals (" ")) | | unifiedCreditCode.length () !=18) {   返回错误;   }      Integer> Map<角色;代码=generateCodes ();   int parityBit;   尝试{   parityBit=getParityBit (unifiedCreditCode、编码);   }捕捉(ValidationException异常e) {   返回错误;   }      返回parityBit==codes.get (unifiedCreditCode.charAt (unifiedCreditCode.length () - 1));   }/* *   *获取较验码   *   * @param unifiedCreditCode统一社会信息代码   * @param码带有映射关系的国家代码   * @return获取较验位的值   */静态int getParityBit(字符串unifiedCreditCode Map<性格,Integer>编码){   char [] businessCodeArray=unifiedCreditCode.toCharArray ();      int和=0;   for (int i=0;我& lt;17;我+ +){   字符键=businessCodeArray[我];   如果(baseCode.indexOf(关键)==1){   把新的ValidationException异常(“第”+字符串。返回对象的值(i + 1) +“位传入了非法的字符“+键);   }   和+=(codes.get(关键)* wi[我]);   }   int结果=31 - % 31总和;   返回结果==31日& # 63;0:结果;   }/* *   *获取一个随机的统一社会信用代码   *   * @return统一社会信用代码   */静态字符串generateOneUnifiedCreditCode () {   随机随机=new随机();   StringBuilder buf=new StringBuilder ();      for (int i=0;我& lt;17;+ + i) {   int num=random.nextInt (baseCode.length () - 1);   buf.append (baseCode.charAt (num));   }      字符串代码=buf.toString ();   字符串upperCode=code.toUpperCase ();   Integer> BidiMap<角色;代码=generateCodes ();   int parityBit=getParityBit (upperCode、编码);      如果(codes.getKey (parityBit)==null) {   logger.debug(“生成社会统一信用代码不符合规则”);   upperCode=generateOneUnifiedCreditCode ();   其他}{   upperCode=upperCode + codes.getKey (parityBit);   }      返回upperCode;   }   }   之前      

测试
  

        包com.mengyunzhi.common.utils;      进口org.assertj.core.api.Assertions;   进口org.junit.Test;      进口静态org.junit.Assert。*;      公开课UnifiedCreditCodeUtilsTest {      @Test   公共空间validateUnifiedCreditCode () {   字符串代码=?11310827965850580”;   Assertions.assertThat (UnifiedCreditCodeUtils.validateUnifiedCreditCode(代码).isTrue ();   }   }      之前      

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

JAVA实现社会统一信用代码校验的方法