统一社会信用代码校验

Python统一社会信用代码校验

根据全国组织机构统一社会信用代码数据服务中心 标准文档进行统一社会信用代码有效性的校验。

此代码主要作为自定函数供clickhouse使用,也可单独执行,从控制台输入json进行校验。

#!/usr/bin/python3


import sys
import json
import re

# 统一信用代码
'''参考资料
1. GB 32100-2015 法人和其他组织统一社会信用代码编码规则   https://www.cods.org.cn/c/2020-10-29/12575.html 
2. GB 32100-2015XG1-2016 《法人和其他组织统一社会信用代码编码规则》国家标准第1号修改单  https://www.cods.org.cn/c/2020-10-29/12574.html
3. GB 11714-1997 《全国组织机构代码编制规则》 https://www.cods.org.cn/c/2020-10-29/12582.html (附录A字符集与GB 32100-2015 字符集有差异,暂不单独校验组织机构代码)
'''
# 区域码前两位
area = ['11', '12', '13', '14', '15', '21', '22', '23', '31', '32', '33', '34', '35', '36', '37', '41', '42', '43',
        '44', '45', '46', '50', '51', '52', '53', '54', '61', '62',
        '63', '64', '65', '71', '81', '82', '91']
# 登记管理部门代码+机构类别代码,构成统一信用代码前两位
dep_org_code = ['11', '12', '13', '19', '21', '29', '31', '32', '33', '34', '35', '39', '41', '49', '51', '52', '53',
                '59', '61', '62', '69', '71', '72', '79', '81', '89', '91', '92', '93', 'A1', 'A9', 'N1', 'N2', 'N3',
                'N9', 'Y1', ]

# dep_org_code_x = ['54', '55']  # 疑似旧标准 54 农村居民委员会 55 城市居民委员会

# 加权因子 MOD(3^(i-1),31)
# wi = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28]
wi = [3 ** (i - 1) % 31 for i in range(1, 18)]
# 附录A 代码字符集:字符0-9对应数字0-9,字母A-Z中去掉I、O、S、V、Z后剩下的20个依次对应数字10-30(第31对应字符0)
A1 = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'A': 10, 'B': 11, 'C': 12,
      'D': 13, 'E': 14, 'F': 15, 'G': 16, 'H': 17, 'J': 18, 'K': 19, 'L': 20, 'M': 21, 'N': 22, 'P': 23, 'Q': 24,
      'R': 25,
      'T': 26, 'U': 27, 'W': 28, 'X': 29, 'Y': 30}
A1_reverse = {v: k for k, v in A1.items()}
if __name__ == '__main__':
    for line in sys.stdin:
        value = json.loads(line)
        ID = value.get('sid')
        if ID is None or len(ID) == 0:
            msg = '统一信用代码为空'
        elif len(ID) != 18:
            msg = '统一信用代码不为18位'
        elif re.findall(r'[^0-9A-Z]', ID):
            # msg = '包含非法字符或小字母:' + ','.join(set(re.findall(r'[^0-9A-Z]', ID)))
            msg = '包含非法字符或小字母'
        elif re.findall(r'[IOZSV]', ID):
            # msg = '包含规则外字母(I,O,Z,S,V):' + ','.join(set(re.findall(r'[IOZSV]', ID)))
            msg = '包含规则外字母(I,O,Z,S,V)'
        elif ID[:2] not in dep_org_code:
            msg = '前2位组合不符合代码要求'
        elif re.findall(r'[^0-9]]', ID[2:8]) or ID[2:4] not in area:
            msg = '第3~8位行政区划代码错误'
        # elif 9~17位组织机构代码
        else:
            c = 0
            for i in range(17):
                # print(ID[i], A1[ID[i]], A1[ID[i]] * wi[i])
                c += A1[ID[i]] * wi[i]
            # print('C:%s' % c)
            c18 = 31 - c % 31
            cc = A1_reverse[c18] if c18 != 31 else '0'
            # print('校验码:%s' % t)
            if cc != ID[-1]:
                # msg = '校验码错误,应为%s' % cc
                msg = '校验码错误'
            else:
                msg = '1'  # 统一信用代码合法
        data = {'result': msg}
        print(json.dumps(data), end='\n')
        sys.stdout.flush()

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值