JAVA實(shí)現(xiàn)社會(huì)統(tǒng)一信用代碼校驗(yàn)的方法
網(wǎng)上找了幾個(gè),寫的都不太適合,有的寫出來了,也沒有給出參考的算法鏈接。這樣就導(dǎo)致了如果產(chǎn)生錯(cuò)誤我們無法排查(不懂原理怎么排查對(duì)吧)。
如果在使用過程中有疑慮,請(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)系的國家代碼
* @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();
}
}
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 利用Java正則表達(dá)式校驗(yàn)郵箱與手機(jī)號(hào)
- java使用正則表達(dá)校驗(yàn)手機(jī)號(hào)碼示例(手機(jī)號(hào)碼正則)
- JAVA 18位身份證號(hào)碼校驗(yàn)碼的算法
- java累加和校驗(yàn)實(shí)現(xiàn)方式16進(jìn)制(推薦)
- java中文及特殊字符的校驗(yàn)方法
- java身份證合法性校驗(yàn)并提取身份證有效信息
- Java發(fā)送郵箱驗(yàn)證碼、session校驗(yàn)功能
- Java實(shí)現(xiàn)的校驗(yàn)銀行卡功能示例
- Java校驗(yàn)銀行卡是否正確的核心代碼
- Java基于正則實(shí)現(xiàn)的日期校驗(yàn)功能示例
- JAVA正則表達(dá)式校驗(yàn)qq號(hào)碼的方法
相關(guān)文章
Java開發(fā)HashMap?key必須實(shí)現(xiàn)hashCode?equals方法原理
這篇文章主要為大家介紹了Java開發(fā)HashMap?key必須實(shí)現(xiàn)hashCode?equals方法原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
Java語言中finally是否一定會(huì)執(zhí)行你知道嗎
這篇文章主要為大家詳細(xì)介紹了Java finally是否一定會(huì)執(zhí)行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
詳解spring cloud hystrix 請(qǐng)求合并collapsing
這篇文章主要介紹了詳解spring cloud hystrix 請(qǐng)求合并collapsing,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
SpringBoot項(xiàng)目配置postgresql數(shù)據(jù)庫完整步驟(配置多數(shù)據(jù)源)
PostgreSQL是一種特性非常齊全的自由軟件的對(duì)象-關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(ORDBMS),下面這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目配置postgresql數(shù)據(jù)庫(配置多數(shù)據(jù)源)的相關(guān)資料,需要的朋友可以參考下2023-05-05
SpringMVC整合websocket實(shí)現(xiàn)消息推送及觸發(fā)功能
這篇文章主要為大家詳細(xì)介紹了SpringMVC整合websocket實(shí)現(xiàn)消息推送及觸發(fā)功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03
舉例詳解用Java實(shí)現(xiàn)web分頁功能的方法
這篇文章主要介紹了舉例詳解用Java實(shí)現(xiàn)web分頁功能的方法,這種基本功能現(xiàn)一般通過Hibernate框架來完成,需要的朋友可以參考下2015-10-10

