JAVA实现社会统一信用代码校验的方法
网上找了几个,写的都不太适合,有的写出来了,也没有给出参考的算法链接。这样就导致了如果产生错误我们无法排查(不懂原理怎么排查对吧)。
如果在使用过程中有疑虑,请参考:较验规则
packagecom.mengyunzhi.common.utils; importorg.apache.commons.collections4.BidiMap; importorg.apache.commons.collections4.bidimap.TreeBidiMap; importorg.slf4j.Logger; importorg.slf4j.LoggerFactory; importjavax.validation.ValidationException; importjava.util.Map; importjava.util.Random; /** *统一社会停用用代码 */ publicinterfaceUnifiedCreditCodeUtils{ Loggerlogger=LoggerFactory.getLogger(UnifiedCreditCodeUtils.class); StringbaseCode="0123456789ABCDEFGHJKLMNPQRTUWXY"; char[]baseCodeArray=baseCode.toCharArray(); int[]wi={1,3,9,27,19,26,16,17,20,29,25,13,8,24,10,30,28}; /** *生成供较验使用的CodeMap * *@returnBidiMap */ staticBidiMapgenerateCodes(){ BidiMap codes=newTreeBidiMap<>(); for(inti=0;i codes=generateCodes(); intparityBit; try{ parityBit=getParityBit(unifiedCreditCode,codes); }catch(ValidationExceptione){ returnfalse; } returnparityBit==codes.get(unifiedCreditCode.charAt(unifiedCreditCode.length()-1)); } /** *获取较验码 * *@paramunifiedCreditCode统一社会信息代码 *@paramcodes带有映射关系的国家代码 *@return获取较验位的值 */ staticintgetParityBit(StringunifiedCreditCode,Map codes){ char[]businessCodeArray=unifiedCreditCode.toCharArray(); intsum=0; for(inti=0;i<17;i++){ charkey=businessCodeArray[i]; if(baseCode.indexOf(key)==-1){ thrownewValidationException("第"+String.valueOf(i+1)+"位传入了非法的字符"+key); } sum+=(codes.get(key)*wi[i]); } intresult=31-sum%31; returnresult==31?0:result; } /** *获取一个随机的统一社会信用代码 * *@return统一社会信用代码 */ staticStringgenerateOneUnifiedCreditCode(){ Randomrandom=newRandom(); StringBuilderbuf=newStringBuilder(); for(inti=0;i<17;++i){ intnum=random.nextInt(baseCode.length()-1); buf.append(baseCode.charAt(num)); } Stringcode=buf.toString(); StringupperCode=code.toUpperCase(); BidiMap codes=generateCodes(); intparityBit=getParityBit(upperCode,codes); if(codes.getKey(parityBit)==null){ logger.debug("生成社会统一信用代码不符合规则"); upperCode=generateOneUnifiedCreditCode(); }else{ upperCode=upperCode+codes.getKey(parityBit); } returnupperCode; } }
测试
packagecom.mengyunzhi.common.utils; importorg.assertj.core.api.Assertions; importorg.junit.Test; importstaticorg.junit.Assert.*; publicclassUnifiedCreditCodeUtilsTest{ @Test publicvoidvalidateUnifiedCreditCode(){ Stringcode="911310827965850580"; Assertions.assertThat(UnifiedCreditCodeUtils.validateUnifiedCreditCode(code)).isTrue(); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。