欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

網上找了幾個,寫的都不太適合,有的寫出來了,也沒有給出參考的算法鏈接。這樣就導致了如果產生錯誤我們無法排查(不懂原理怎么排查對吧)。

如果在使用過程中有疑慮,請參考:較驗規(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)一社會停用用代碼
 */
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;
  }

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

  /**
   * 獲取一個隨機的統(tǒng)一社會信用代碼
   *
   * @return 統(tǒng)一社會信用代碼
   */
  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("生成社會統(tǒng)一信用代碼不符合規(guī)則");
      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 NIO的Write事件

    小白也可以學會的Java NIO的Write事件

    剛開始對NIO的寫操作理解的不深,不知道為什么要注冊寫事件,何時注冊寫事件,為什么寫完之后要取消注冊寫事件,今天特地整理了本篇文章,需要的朋友可以參考下
    2021-06-06
  • Springboot項目快速實現(xiàn)過濾器功能

    Springboot項目快速實現(xiàn)過濾器功能

    上篇文章已經給大家介紹了Springboot項目如何快速實現(xiàn)Aop功能,這篇文章給大家介紹Springboot項目如何快速實現(xiàn)過濾器功能,感興趣的小伙伴可以參考閱讀
    2023-03-03
  • SpringMVC中轉發(fā)與重定向的區(qū)別淺析

    SpringMVC中轉發(fā)與重定向的區(qū)別淺析

    這篇文章主要給大家介紹了關于SpringMVC中轉發(fā)與重定向的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • SpringBoot整合MinIO實現(xiàn)文件上傳的方法詳解

    SpringBoot整合MinIO實現(xiàn)文件上傳的方法詳解

    一般涉及到文件上傳,基本上都是保存在項目本地,這種方式比較省事,但是安全性不高。所以今天給大伙詳細介紹一些如何利用MinIO實現(xiàn)文件上傳,感興趣的可以了解一下
    2022-05-05
  • springboot?web項目中?Set-Cookie?失敗原因及解決辦法

    springboot?web項目中?Set-Cookie?失敗原因及解決辦法

    這篇文章主要介紹了springboot?web項目中?Set-Cookie?失敗原因及解決辦法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-10-10
  • MyBatis批量插入大量數(shù)據(1w以上)

    MyBatis批量插入大量數(shù)據(1w以上)

    MyBatis進行批量插入數(shù)時,一次性插入超過一千條的時候MyBatis開始報錯,本文主要介紹了MyBatis批量插入大量數(shù)據的解決方法,感興趣的可以了解一下
    2022-01-01
  • MyBatisPlus條件構造器圖文實例詳解

    MyBatisPlus條件構造器圖文實例詳解

    這篇文章主要介紹了MyBatisPlus條件構造器,了解內部原理是為了幫助我們做擴展,同時也是驗證了一個人的學習能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會的
    2023-01-01
  • 代碼分析JAVA中PCM人聲音頻變聲處理

    代碼分析JAVA中PCM人聲音頻變聲處理

    本篇文章通過代碼實例給大家分析了JAVA中PCM人聲音頻變聲處理的問題,有興趣的朋友跟著學習分考下吧。
    2018-01-01
  • java正則表達式判斷強密碼和隨機生成強密碼代碼示例

    java正則表達式判斷強密碼和隨機生成強密碼代碼示例

    這篇文章主要給大家介紹了關于java正則表達式判斷強密碼和隨機生成強密碼的相關資料,最近需要一個密碼強度正則表達式在用戶注冊時校驗用戶密碼強度,需要的朋友可以參考下
    2023-08-08
  • spring依賴注入成功但在調用接口的時候拿到的依賴卻是null問題

    spring依賴注入成功但在調用接口的時候拿到的依賴卻是null問題

    這篇文章主要介紹了spring依賴注入成功但在調用接口的時候拿到的依賴卻是null問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論