JAVA实现社会统一信用代码校验的方法
作者:myskies 发布时间:2023-04-10 08:38:21
标签: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();
}
}
来源:https://segmentfault.com/a/1190000019636243


猜你喜欢
- 写在前面:上周末抽点时间把自己写的一个简单Socket聊天程序的初始设计和服务端细化设计记录了一下,周二终于等来毕业 * 的软考证书,然后接下
- spring-retry是什么?spring-retry是spring提供的一个重试框架,原本自己实现的重试机制,现在spring帮封装好提
- Intellij Idea打包Java项目打开模块设置如下图所示,选中需要打包的模块,右键点击,即会出现如下图所示的内容,点击Open Mo
- 编写规范目的:能够在编码过程中实现规范化,为以后的程序开发中养成良好的行为习惯。1、 项目名全部小写2、 包名全部小写3、 类名首字母大写,
- 给组件加上 * 定义一个类,这个类继承ActionListenerpubulic class ButListener implements
- 本文实例讲述了C#用匿名方法定义委托的实现方法。分享给大家供大家参考。具体实现方法如下://用匿名方法定义委托 class Program
- 概述:堆排序是利用构建“堆”的方法确定具有最大值的数据元素,并把该元素与最后位置上的元素交换。可将任意一个由n个数据元素构成的序列按照(a1
- 前言对于Java程序员,可以说对于ArrayList和LinkedList可谓是十分熟悉了对于ArrayList和LinkedList,他们
- @Value注解设置默认值在Spring Boot中,如果使用@Value注解对属性进行赋值,但如果在配置文件或启动参数中未指定对应的参数值
- 1.3扫描线种子填充算法1.1和1.2节介绍的两种种子填充算法的优点是非常简单,缺点是使用了递归算法,这不但需要大量栈空间来存储相邻的点,而
- axMapControl1是主控件,axMapControl2是鹰眼控件要看清楚事件响应 1.鹰眼地图资源载入privatevoi
- 本文实例为大家分享了Android Studio实现登录界面的具体代码,供大家参考,具体内容如下题目设计一个登录界面。要求:a) 包含用户名
- Unity Shader学习:玻璃材质,供大家参考。主要是通过反射和折射来达到透明的效果,用菲涅尔来混叠。shader部分:Shader &
- 任意位置获取HttpServletRequest对象方法一//获取RequestAttributes RequestAttributes r
- 1.map遍历快速实现边距,文字自适应改变大小Container( // padding: EdgeI
- 1. 引入jar包pom.xml文件<?xml version="1.0" encoding="UTF-
- 目录一、环境搭建二、RetryTemplate2.1 RetryTemplate2.2 RetryListener2.3 回退策略2.3.1
- 一般来说,在更新DataTable或是DataSet时,如果不采用SqlParameter,那么当输入的Sql语句出现歧义时,如字符串中含有
- 在项目中,时常会有异步调用的需求web.xml配置<servlet> <description>spri
- 前言:在android HTML5 开发中有不少人遇到过 audio 标签 autoplay在某些设备上无效的问题,网上大多是讲怎么在js中