摘要:網上找了幾個,寫的都不太適合,有的寫出來了,也沒有給出參考的算法鏈接。這樣就導致了如果產生錯誤我們無法排查不懂原理怎么排查對吧。
網上找了幾個,寫的都不太適合,有的寫出來了,也沒有給出參考的算法鏈接。這樣就導致了如果產生錯誤我們無法排查(不懂原理怎么排查對吧)。
如果在使用過程中有疑慮,請參考:較驗規則
代碼實現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(); } }
希望對你有幫助
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/75112.html
摘要:對于給圖片打標簽,我們經常使用來,但是在遇到中文成為流行語言的時候,給圖片寫上中文成為一大亮點。簡介就例如在車輛屬性車牌識別的時候,我們經常會使用得到中文。 對于給...
摘要:云計算產業成熟率先推行信用管理進入成熟期的云計算產業,在多方面因素的共同作用下,實現了云服務信用管理體系的構建。建立信用管理制度建立失信名單和懲戒制度的明確提出,表明信用管理工作已成為工信部后續重要工作方向。據人民郵電報報道,近年來,加強社會信用體系建設成為國內外關注的重點。工信部將信息通信領域監管重心由事前逐步轉向事中事后,并積極探索和推動市場信用管理機制的建設。其中,云服務行業信用管理工...
摘要:導言近日,京東區塊鏈底層引擎正式對外開源并同步上線開源社區,旨在為企業級用戶和開發者提供開源服務,幫助他們提高研發效率,加速技術創新。白皮書指出,京東區塊鏈的技術架構分為和兩部分。 導言 近日,京東區塊鏈底層引擎JD Chain正式對外開源并同步上線開源社區,旨在為企業級用戶和開發者提供開源服務,幫助他們提高研發效率,加速技術創新。3月30日,國家互聯網信息辦公室公布了第一批區塊鏈信息...
閱讀 3770·2023-04-25 21:09
閱讀 3128·2021-10-20 13:48
閱讀 2942·2021-09-24 10:25
閱讀 2931·2021-08-21 14:08
閱讀 1790·2019-08-30 15:56
閱讀 976·2019-08-30 15:52
閱讀 1841·2019-08-29 14:11
閱讀 3562·2019-08-29 11:01