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

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

代码实现

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 generateCodes() {

BidiMap 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 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 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 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 组织机构代码_JAVA实现社会统一信用代码较验相关推荐

  1. java 组织机构代码_JAVA实现社会统一信用代码校验的方法|chu

    网上找了几个,写的都不太适合,有的写出来了,也没有给出参考的算法链接.这样就导致了如果产生错误我们无法排查(不懂原理怎么排查对吧). 如果在使用过程中有疑虑,请参考:较验规则 package com. ...

  2. java 组织机构代码_JAVA实现社会统一信用代码校验的方法

    网上找了几个,写的都不太适合,有的写出来了,也没有给出参考的算法链接.这样就导致了如果产生错误我们无法排查(不懂原理怎么排查对吧). 如果在使用过程中有疑虑,请参考:较验规则 package com. ...

  3. java 社会统一信用代码分解,获取登记管理部门代码、机构类别代码、登记管理机关行政区划码、 主体标识码、校验码

    问题描述: `提示:根据已有的社会统一信用编码,获取每个组成部分的内容 学习内容: 提示:这里需要说明一下,统一社会信用代码的构成 社会统一信用代码是由18位 阿拉伯数字或大写英文字母(不使用I.O. ...

  4. Python 生成、识别社会统一信用代码

    三证合一之后,社会统一信用代码就是企业的身份证.也就是说只要你的程序涉及企业信息的录入,那就少不了社会统一信用代码的录入.这里分享一个工具,可以用 Python 来识别社会统一信用代码,也可以随机生成 ...

  5. Js中身份证验证及社会统一信用代码验证

    二代身份证验证规则如下: //函数参数必须是字符串,因为二代身份证号码是十八位,而在javascript中,十八位的数值会超出计算范围,造成不精确的结果,导致最后两位和计算的值不一致,从而该函数出现错 ...

  6. oracle校验社会统一信用代码(菜J笔记)

    今天下午花了一下午时间,查了很久百度,写了一个很菜的东西 如果有什么问题,欢迎各位大佬指出,直接上代码 统一社会信用代码编码规则-维基百科 身份证号码的编码规则及校验-简书 国家企业信用信息公示查询系 ...

  7. 手机号,身份证号,邮政编码,统一信用代码,发票抬头,纳税人识别号正则校验

    手机号 phone(rule, value, callback) {const reg = /^[1][3,4,5,6.7,8,9][0-9]{9}$/if (!reg.test(value)) {c ...

  8. PHP验证统一信用代码

    <?php /*** 判断是否为统一社会信用代码*/ function isCompanyCode($str){$one = '159Y';//第一位可以出现的字符$two = '12391'; ...

  9. java range(10)_Java 中的十个 ” 单行代码编程 ” ( OneLiner )

    原标题:Java 中的十个 " 单行代码编程 " ( OneLiner ) 作者:飒然Hang 原文链接:www.rowkey.me/blog/2017/09/09/java-on ...

最新文章

  1. “数据科学家”或许不再性感,但“数据团队”的产业化才刚开始 | 专访领英全球数据科学团队负责人...
  2. oracle 中update多个字段
  3. mysql创建部分索引
  4. Linux的profile与bashrc的分析
  5. 用python结束exe进程
  6. JVM内存模型、指令重排、内存屏障概念解析
  7. visual studio 怎么生成coredump文件_coredump详解
  8. 金融数据分析与挖掘实战练习2.5-2.9
  9. mysql中having的例子_有关mysql中having子句对组记录进行筛选的例子
  10. php upload 缓存_thinkphp Upload上传文件在客户端生成的临时文件$_FILES['file']['tmp_name']...
  11. Python---基础-运算符int和range函数
  12. 出现java.lang.NoSuchMethodError错误的原因
  13. 传智播客java测试题_传智播客java测试题
  14. Java开发文档Swagger的使用详细教程
  15. 2011高校信息化实践者精英论坛之上海交大BI系统汇报
  16. 15分钟用ppt制作桌面整理四格壁纸
  17. React通过后台图片路径,打包下载图片
  18. 黑客内核:如何实现属于你的实时内核?
  19. AI测试中的数据收集
  20. #036数字信息指南十分钟速成课

热门文章

  1. 简易凯撒密码实现,很容易
  2. 【Soul】用户运营策略分析报告
  3. 一、计算机程序申请专利注意事项解读
  4. 模型压缩工具Distiller-剪枝
  5. 【XSY-Contest2618.Problem A】抢夺
  6. Call call=(Call)service.createCall()报错
  7. python字符串长度输出_python输出指定长度的字符串
  8. 怎么撰写一份优秀的数据分析报告(一)
  9. thinkphp图片拖动验证码
  10. win10 解决:无法访问网络地址