JAVA实现社会统一信用代码校验的方法
更新时间:2019年07月02日 09:25:58 作者:myskies
这篇文章主要介绍了JAVA实现社会统一信用代码校验的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
网上找了几个,写的都不太适合,有的写出来了,也没有给出参考的算法链接。这样就导致了如果产生错误我们无法排查(不懂原理怎么排查对吧)。
如果在使用过程中有疑虑,请参考:较验规则
package com.mengyunzhi.common.utils;
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.TreeBidiMap;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.validation.ValidationException;
import java.util.Map;
import java.util.Random;
/**
* 统一社会停用用代码
*/
public interface UnifiedCreditCodeUtils {
Logger logger = LoggerFactory.getLogger(UnifiedCreditCodeUtils.class);
String baseCode = "0123456789ABCDEFGHJKLMNPQRTUWXY";
char[] baseCodeArray = baseCode.toCharArray();
int[] wi = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28};
/**
* 生成供较验使用的 Code Map
*
* @return BidiMap
*/
static BidiMap<Character, Integer> generateCodes() {
BidiMap<Character, Integer> codes = new TreeBidiMap<>();
for (int i = 0; i < baseCode.length(); i++) {
codes.put(baseCodeArray[i], i);
}
return codes;
}
/**
* 较验社会统一信用代码
*
* @param unifiedCreditCode 统一社会信息代码
* @return 符合: true
*/
static boolean validateUnifiedCreditCode(String unifiedCreditCode) {
if ((unifiedCreditCode.equals("")) || unifiedCreditCode.length() != 18) {
return false;
}
Map<Character, Integer> codes = generateCodes();
int parityBit;
try {
parityBit = getParityBit(unifiedCreditCode, codes);
} catch (ValidationException e) {
return false;
}
return parityBit == codes.get(unifiedCreditCode.charAt(unifiedCreditCode.length() - 1));
}
/**
* 获取较验码
*
* @param unifiedCreditCode 统一社会信息代码
* @param codes 带有映射关系的国家代码
* @return 获取较验位的值
*/
static int getParityBit(String unifiedCreditCode, Map<Character, Integer> codes) {
char[] businessCodeArray = unifiedCreditCode.toCharArray();
int sum = 0;
for (int i = 0; i < 17; i++) {
char key = businessCodeArray[i];
if (baseCode.indexOf(key) == -1) {
throw new ValidationException("第" + String.valueOf(i + 1) + "位传入了非法的字符" + key);
}
sum += (codes.get(key) * wi[i]);
}
int result = 31 - sum % 31;
return result == 31 ? 0 : result;
}
/**
* 获取一个随机的统一社会信用代码
*
* @return 统一社会信用代码
*/
static String generateOneUnifiedCreditCode() {
Random random = new Random();
StringBuilder buf = new StringBuilder();
for (int i = 0; i < 17; ++i) {
int num = random.nextInt(baseCode.length() - 1);
buf.append(baseCode.charAt(num));
}
String code = buf.toString();
String upperCode = code.toUpperCase();
BidiMap<Character, Integer> codes = generateCodes();
int parityBit = getParityBit(upperCode, codes);
if (codes.getKey(parityBit) == null) {
logger.debug("生成社会统一信用代码不符合规则");
upperCode = generateOneUnifiedCreditCode();
} else {
upperCode = upperCode + codes.getKey(parityBit);
}
return upperCode;
}
}
测试
package com.mengyunzhi.common.utils;
import org.assertj.core.api.Assertions;
import org.junit.Test;
import static org.junit.Assert.*;
public class UnifiedCreditCodeUtilsTest {
@Test
public void validateUnifiedCreditCode() {
String code = "911310827965850580";
Assertions.assertThat(UnifiedCreditCodeUtils.validateUnifiedCreditCode(code)).isTrue();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
Java开发HashMap key必须实现hashCode equals方法原理
这篇文章主要为大家介绍了Java开发HashMap key必须实现hashCode equals方法原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-03-03
详解spring cloud hystrix 请求合并collapsing
这篇文章主要介绍了详解spring cloud hystrix 请求合并collapsing,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-05-05
SpringBoot项目配置postgresql数据库完整步骤(配置多数据源)
PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),下面这篇文章主要给大家介绍了关于SpringBoot项目配置postgresql数据库(配置多数据源)的相关资料,需要的朋友可以参考下2023-05-05
SpringMVC整合websocket实现消息推送及触发功能
这篇文章主要为大家详细介绍了SpringMVC整合websocket实现消息推送及触发功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-03-03


最新评论