资讯专栏INFORMATION COLUMN

JAVA实现社会统一信用代码较验

DevYK / 3542人阅读

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

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

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

代码实现
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();
    }
}

希望对你有帮助

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75112.html

相关文章

  • Pillow 10行代码给营业执照模板写数据,批量生产

    摘要:对于给图片打标签,我们经常使用来,但是在遇到中文成为流行语言的时候,给图片写上中文成为一大亮点。简介就例如在车辆属性车牌识别的时候,我们经常会使用得到中文。 对于给...

    aaron 评论0 收藏0
  • 云计算产业如何率先推行信用管理?

    摘要:云计算产业成熟率先推行信用管理进入成熟期的云计算产业,在多方面因素的共同作用下,实现了云服务信用管理体系的构建。建立信用管理制度建立失信名单和惩戒制度的明确提出,表明信用管理工作已成为工信部后续重要工作方向。据人民邮电报报道,近年来,加强社会信用体系建设成为国内外关注的重点。工信部将信息通信领域监管重心由事前逐步转向事中事后,并积极探索和推动市场信用管理机制的建设。其中,云服务行业信用管理工...

    XUI 评论0 收藏0
  • 揭秘京东区块链开源项目——JD Chain

    摘要:导言近日,京东区块链底层引擎正式对外开源并同步上线开源社区,旨在为企业级用户和开发者提供开源服务,帮助他们提高研发效率,加速技术创新。白皮书指出,京东区块链的技术架构分为和两部分。 导言 近日,京东区块链底层引擎JD Chain正式对外开源并同步上线开源社区,旨在为企业级用户和开发者提供开源服务,帮助他们提高研发效率,加速技术创新。3月30日,国家互联网信息办公室公布了第一批区块链信息...

    xzavier 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<