为了验证统一社会信用代码的最后一位校验码是否正确,我们可以按照以下步骤实现一个Python函数:
字符集验证:统一社会信用代码由18位字符组成,包括数字0-9和大写字母(排除I、O、Z、S、V)。
字符到数值的映射:将前17位字符转换为对应的数值,其中数字直接转换,字母按特定规则转换。
权重计算:每个位置的权重为3的幂次模31的结果。
加权求和:计算前17位数值与对应权重的乘积之和。
校验码计算:根据加权和模31的结果确定校验码数值,再转换为对应字符。
def checkCreditno(code): # 统一社会信用代码的字符到数值的映射 char_map = { '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 } # 校验码数值到字符的映射 value_map = {v: k for k, v in char_map.items() if k.isalpha() or k in '0123456789'} # 检查长度是否为18位 if len(code) != 18: return False main_part = code[:17] check_char = code[17] # 检查前17位是否有效 for c in main_part: if c not in char_map: return False # 检查校验位字符是否有效 if check_char not in char_map: return False # 转换为数值列表 nums = [char_map[c] for c in main_part] # 计算权重:3^i mod 31,i从0到16 weights = [pow(3, i, 31) for i in range(17)] # 计算加权和 total = sum(num * weight for num, weight in zip(nums, weights)) # 计算校验码数值 check_value = (31 - (total % 31)) % 31 # 确定正确的校验字符 if check_value < 10: expected_char = str(check_value) else: expected_char = value_map.get(check_value, None) if expected_char is None: return False # 这种情况理论上不会发生 # 比较校验字符 return expected_char == check_char check_result = checkCreditno('91110000802100433B') print(check_result)
字符映射:char_map定义了有效字符及其对应的数值,排除了一些易混淆的字母。
长度和字符检查:确保输入为18位,且所有字符有效。
数值转换:将前17位字符转换为对应的数值。
权重计算:使用3的幂次模31生成权重数组。
加权和与校验码计算:计算加权和后确定校验码数值,并转换为对应的校验字符。
结果验证:比较计算得到的校验字符与输入的最后一位是否一致,返回验证结果。
该方法严格遵循国家标准GB 32100-2015,确保校验过程准确可靠。
© 2015-2025 杭州极速互联科技有限公司 版权所有 浙ICP备17047587号-4 浙公网安备33010502005096 增值电信业务经营许可证:浙B2-20190875