Java生成统一社会信用代码

1. 什么是统一社会信用代码?

统一社会信用代码是由国家工商行政管理总局颁发给企业、事业单位、社会团体和其他组织的唯一识别号码,用于标识组织的身份和信息。统一社会信用代码由18位字符组成,包括数字、英文字母和校验码。它的生成规则是根据ISO/IEC 7064:2003 Mod 11, 10校验码计算而得。

2. 统一社会信用代码的生成规则

统一社会信用代码的前17位是由组织机构代码、登记管理部门代码和登记管理机关行政区域码组成,最后一位是校验码。校验码的计算方法如下所示:

  1. 将前17位的每一位数与权重因子相乘,权重因子从左到右依次为1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28。
  2. 将每一位数与权重因子相乘的结果相加。
  3. 将相加结果除以31,得到余数。
  4. 用31减去余数,得到校验码。

3. Java代码示例

下面是一个使用Java生成统一社会信用代码的示例代码:

import java.util.Random;

public class UnifiedSocialCreditCodeGenerator {
    private static final String[] ORGANIZATION_TYPES = {"企业", "事业单位", "社会团体", "其他组织"};
    private static final String[] ADMINISTRATION_REGIONS = {"北京", "上海", "广东", "江苏", "浙江", "山东", "河南", "河北", "湖南", "湖北", "陕西", "重庆", "天津", "福建", "吉林", "辽宁", "江西", "安徽", "四川", "山西", "黑龙江", "内蒙古", "广西", "宁夏", "海南", "贵州", "云南", "青海", "西藏", "新疆", "甘肃"};

    public static String generate() {
        String organizationType = ORGANIZATION_TYPES[new Random().nextInt(ORGANIZATION_TYPES.length)];
        String administrationRegion = ADMINISTRATION_REGIONS[new Random().nextInt(ADMINISTRATION_REGIONS.length)];
        String organizationCode = generateOrganizationCode();
        String registrationDepartmentCode = generateRegistrationDepartmentCode();
        String registrationAdministrativeRegionCode = generateRegistrationAdministrativeRegionCode(administrationRegion);
        String checksum = generateChecksum(organizationCode, registrationDepartmentCode, registrationAdministrativeRegionCode);
        return organizationType + administrationRegion + organizationCode + registrationDepartmentCode + registrationAdministrativeRegionCode + checksum;
    }

    private static String generateOrganizationCode() {
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 8; i++) {
            sb.append(random.nextInt(10));
        }
        return sb.toString();
    }

    private static String generateRegistrationDepartmentCode() {
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 2; i++) {
            sb.append(random.nextInt(10));
        }
        return sb.toString();
    }

    private static String generateRegistrationAdministrativeRegionCode(String administrationRegion) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < ADMINISTRATION_REGIONS.length; i++) {
            if (ADMINISTRATION_REGIONS[i].equals(administrationRegion)) {
                sb.append(String.format("%02d", i + 1));
                break;
            }
        }
        return sb.toString();
    }

    private static String generateChecksum(String organizationCode, String registrationDepartmentCode, String registrationAdministrativeRegionCode) {
        String code = organizationCode + registrationDepartmentCode + registrationAdministrativeRegionCode;
        int[] weights = {1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28};
        int sum = 0;
        for (int i = 0; i < code.length(); i++) {
            sum += Character.getNumericValue(code.charAt(i)) * weights[i];
        }
        int checksum = 31 - sum % 31;
        return checksum ==