最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2019年07月02日 09:25:58   作者:myskies  
這篇文章主要介紹了JAVA實(shí)現(xiàn)社會(huì)統(tǒng)一信用代碼校驗(yàn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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

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

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<Character, Integer> generateCodes() {
    BidiMap<Character, Integer> 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<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));
  }

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

  /**
   * 獲取一個(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<Character, Integer> 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();
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

漯河市| 正镶白旗| 舒兰市| 阿拉善右旗| 原阳县| 台湾省| 田东县| 峨边| 丰县| 酉阳| 运城市| 宁河县| 平利县| 河东区| 同仁县| 枝江市| 剑阁县| 绍兴县| 廊坊市| 丹江口市| 东海县| 尼木县| 泰来县| 杭州市| 新闻| 深水埗区| 临武县| 浑源县| 左云县| 延寿县| 岱山县| 金沙县| 衡南县| 万源市| 武陟县| 沐川县| 杭锦旗| 涪陵区| 隆昌县| 河南省| 宁城县|