成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JAVA實(shí)現(xiàn)社會(huì)統(tǒng)一信用代碼較驗(yàn)

DevYK / 3684人閱讀

摘要:網(wǎng)上找了幾個(gè),寫(xiě)的都不太適合,有的寫(xiě)出來(lái)了,也沒(méi)有給出參考的算法鏈接。這樣就導(dǎo)致了如果產(chǎn)生錯(cuò)誤我們無(wú)法排查不懂原理怎么排查對(duì)吧。

網(wǎng)上找了幾個(gè),寫(xiě)的都不太適合,有的寫(xiě)出來(lái)了,也沒(méi)有給出參考的算法鏈接。這樣就導(dǎo)致了如果產(chǎn)生錯(cuò)誤我們無(wú)法排查(不懂原理怎么排查對(duì)吧)。

如果在使用過(guò)程中有疑慮,請(qǐng)參考:較驗(yàn)規(guī)則

代碼實(shí)現(xiàn)
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;

/**
 * 統(tǒng)一社會(huì)停用用代碼
 */
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};

    /**
     * 生成供較驗(yàn)使用的 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;
    }

    /**
     * 較驗(yàn)社會(huì)統(tǒng)一信用代碼
     *
     * @param unifiedCreditCode 統(tǒng)一社會(huì)信息代碼
     * @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));
    }

    /**
     * 獲取較驗(yàn)碼
     *
     * @param unifiedCreditCode 統(tǒng)一社會(huì)信息代碼
     * @param codes             帶有映射關(guān)系的國(guó)家代碼
     * @return 獲取較驗(yàn)位的值
     */
    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;
    }

    /**
     * 獲取一個(gè)隨機(jī)的統(tǒng)一社會(huì)信用代碼
     *
     * @return 統(tǒng)一社會(huì)信用代碼
     */
    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("生成社會(huì)統(tǒng)一信用代碼不符合規(guī)則");
            upperCode = generateOneUnifiedCreditCode();
        } else {
            upperCode = upperCode + codes.getKey(parityBit);
        }

        return upperCode;
    }
}
測(cè)試
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();
    }
}

希望對(duì)你有幫助

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/75112.html

相關(guān)文章

  • Pillow 10行代碼給營(yíng)業(yè)執(zhí)照模板寫(xiě)數(shù)據(jù),批量生產(chǎn)

    摘要:對(duì)于給圖片打標(biāo)簽,我們經(jīng)常使用來(lái),但是在遇到中文成為流行語(yǔ)言的時(shí)候,給圖片寫(xiě)上中文成為一大亮點(diǎn)。簡(jiǎn)介就例如在車(chē)輛屬性車(chē)牌識(shí)別的時(shí)候,我們經(jīng)常會(huì)使用得到中文。 對(duì)于給...

    aaron 評(píng)論0 收藏0
  • 云計(jì)算產(chǎn)業(yè)如何率先推行信用管理?

    摘要:云計(jì)算產(chǎn)業(yè)成熟率先推行信用管理進(jìn)入成熟期的云計(jì)算產(chǎn)業(yè),在多方面因素的共同作用下,實(shí)現(xiàn)了云服務(wù)信用管理體系的構(gòu)建。建立信用管理制度建立失信名單和懲戒制度的明確提出,表明信用管理工作已成為工信部后續(xù)重要工作方向。據(jù)人民郵電報(bào)報(bào)道,近年來(lái),加強(qiáng)社會(huì)信用體系建設(shè)成為國(guó)內(nèi)外關(guān)注的重點(diǎn)。工信部將信息通信領(lǐng)域監(jiān)管重心由事前逐步轉(zhuǎn)向事中事后,并積極探索和推動(dòng)市場(chǎng)信用管理機(jī)制的建設(shè)。其中,云服務(wù)行業(yè)信用管理工...

    XUI 評(píng)論0 收藏0
  • 揭秘京東區(qū)塊鏈開(kāi)源項(xiàng)目——JD Chain

    摘要:導(dǎo)言近日,京東區(qū)塊鏈底層引擎正式對(duì)外開(kāi)源并同步上線開(kāi)源社區(qū),旨在為企業(yè)級(jí)用戶和開(kāi)發(fā)者提供開(kāi)源服務(wù),幫助他們提高研發(fā)效率,加速技術(shù)創(chuàng)新。白皮書(shū)指出,京東區(qū)塊鏈的技術(shù)架構(gòu)分為和兩部分。 導(dǎo)言 近日,京東區(qū)塊鏈底層引擎JD Chain正式對(duì)外開(kāi)源并同步上線開(kāi)源社區(qū),旨在為企業(yè)級(jí)用戶和開(kāi)發(fā)者提供開(kāi)源服務(wù),幫助他們提高研發(fā)效率,加速技術(shù)創(chuàng)新。3月30日,國(guó)家互聯(lián)網(wǎng)信息辦公室公布了第一批區(qū)塊鏈信息...

    xzavier 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<