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(){
BidiMapcodes=newTreeBidiMap<>();
for(inti=0;icodes=generateCodes();
intparityBit;
try{
parityBit=getParityBit(unifiedCreditCode,codes);
}catch(ValidationExceptione){
returnfalse;
}
returnparityBit==codes.get(unifiedCreditCode.charAt(unifiedCreditCode.length()-1));
}
/**
*获取较验码
*
*@paramunifiedCreditCode统一社会信息代码
*@paramcodes带有映射关系的国家代码
*@return获取较验位的值
*/
staticintgetParityBit(StringunifiedCreditCode,Mapcodes){
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();
BidiMapcodes=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();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。