[Golang] 写了一个身份证号码、统一社会信用代码 的合法性校验工具库 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
BlueSky335
V2EX    程序员

[Golang] 写了一个身份证号码、统一社会信用代码 的合法性校验工具库

  •  
  •   BlueSky335 2020-01-01 12:05:32 +08:00 5956 次点击
    这是一个创建于 2180 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目需要,没找到好用的,所以自己根据国标写了一个。分享一下。

    https://github.com/bluesky335/IDCheck


    身份证号码、法人和其他组织统一社会信用代码 的合法性校验

    License: MIT

    用于校验 身份证号码法人和其他组织统一社会信用代码 的工具。

    计算规则参考国家标准文件:

    注:由于早期部分试点地区推行 法人和其他组织统一社会信用代码 较早,会存在部分代码不符合国家标准的情况。但它们都是合法的代码,应当另行处理。 例如:

    福建恒跃柳工机械销售有限公司: 91350100M0001TGQXM 计算出的校验位是 1 和 M 不符

    厦门云上晴空航空科技有限公司:91350211M0000XUF46 计算出的校验位是 R 和 6 不符

    厦门黑脉网络科技有限公司91350203M0001FUE2P 计算出的校验位是 J 和 P 不符

    使用方法

     go get github.com/bluesky335/IDCheck 
    • 法人和其他组织统一社会信用代码

      import "github.com/bluesky335/IDCheck/USCI" var usci = USCI.New("91350100M000100Y43") if usci.IsValid() { fmt.Printf("正确\n") } else { fmt.Printf("错误\n") } 
    • 身份证号码

       import "github.com/bluesky335/IDCheck/IdNumber" var id = IdNumber.New("11010519491231002X") if id.IsValid() { fmt.Printf("%s -> %s\n", id, "正确") } else { fmt.Printf("%s -> %s\n", id, "错误") } 
    15 条回复    2020-01-03 17:12:45 +08:00
    Smash
        1
    Smash  
       2020-01-01 12:21:54 +08:00 via Android
    元旦大家都不摸鱼了,挽尊
    BlueSky335
        2
    BlueSky335  
    OP
       2020-01-01 12:28:09 +08:00
    @Smash 苦逼码农,我太难了
    mscb
        3
    mscb  
       2020-01-01 12:42:06 +08:00 via Android
    好东西,已 star
    AMGRRR
        4
    AMGRRR  
       2020-01-01 15:52:23 +08:00 via Android
    这是干啥用的?
    BlueSky335
        5
    BlueSky335  
    OP
       2020-01-01 16:01:43 +08:00
    @AMGRRR 身份证和统一社会信用代码是有校验位的,这个就是用来检验他们是不是正确的身份证号码和信用代码,确保不是乱填的。
    MrUser
        6
    MrUser  
       2020-01-01 16:06:33 +08:00
    要是有试点地区早期的验证规则就完美了
    BlueSky335
        7
    BlueSky335  
    OP
       2020-01-01 16:13:50 +08:00
    @MrUser 国标文件里没有写
    loading
        8
    loading  
       2020-01-01 16:25:05 +08:00
    建议带上 js 代码,方便前后端一套。
    T3RRY
        9
    T3RRY  
       2020-01-01 23:18:13 +08:00
    收藏
    BlueSky335
        10
    BlueSky335  
    OP
       2020-01-02 13:14:15 +08:00
    @loading 有空我加上
    as80393313
        11
    as80393313  
       2020-01-02 16:53:32 +08:00   1
    @loading
    作者写得有点香啊,这是基于他的改成 JS 版本,简单测试了一下可行,IE5+


    /**
    * @description 校验身份证 (计算规则参考“中国国家标准化管理委员会”官方文档: http://www.gb688.cn/bzgk/gb/newGbInfo?hcno=080D6FBF2BB468F9007657F26D60013E
    * @param value {string} 验证参数
    * @return {boolean}
    */
    function isID (value) {
    if (typeof value != 'string') {
    console.warn('参数类型错误:参数类型为 String')
    return false
    }
    // a1 与对应的校验码对照表,其中 key 表示 a1,value 表示校验码,value 中的 10 表示校验码 X
    var a1Map = {
    0: 1,
    1: 0,
    2: 10,
    3: 9,
    4: 8,
    5: 7,
    6: 6,
    7: 5,
    8: 4,
    9: 3,
    10: 2
    };
    var idStr = value.toUpperCase()
    var reg = /^[0-9]{17}[0-9X]$/
    if (!reg.exec(idStr)) {
    return false
    }
    var sum = 0
    var signChar = ''
    for (var index = 0; index < idStr.length; index++) {
    var i = 18 - index
    var c = idStr.charAt(index)
    var v, weight
    if (i != 1) {
    v = parseInt(c)
    if (!isNaN(v)) {
    // 计算加权因子
    weight = parseInt(Math.pow(2, parseFloat(i - 1))) % 11
    sum += (v * weight)
    } else {
    return false
    }
    } else {
    signChar = c.toString()
    }
    }
    var a1 = a1Map[sum % 11]
    var a1Str = a1.toString()
    if (a1 == 10) {
    a1Str = 'X'
    }
    return a1Str == signChar
    }

    /**
    @description 校验法人和其他组织统一社会信用代码的合法性 (// 计算规则参考“中国国家标准化管理委员会”官方文档: http://www.gb688.cn/bzgk/gb/newGbInfo?hcno=24691C25985C1073D3A7C85629378AC0
    * @param value {string} 验证参数
    * @return {boolean}
    */
    function isUSCI (value) {
    if (typeof value != 'string') {
    console.warn('参数类型错误:参数类型为 String')
    return false
    }
    // 代码字符对应的值
    var valueMap = {
    '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
    }
    var usciStr = value.toUpperCase()
    var reg = /^[A-Z0-9]{18}$/
    if (!reg.exec(usciStr)) {
    console.log('exec:')
    return false
    }
    var weight = 0, sum = 0, index = 0, c, v, usciStrRange = usciStr.slice(0, 17)
    for (index = 0; index < usciStrRange.length; index++) {
    c = usciStrRange.charAt(index)
    v = valueMap[c]
    weight = parseInt(Math.pow(3, parseFloat(index))) % 31
    sum += v * weight
    }
    var mod = sum % 31
    var sign = 31 - mod
    if (sign == 31) {
    sign = 0
    }
    var signChar
    for (var key in valueMap) {
    signChar = key
    if (valueMap[key] == sign) {
    break
    }
    }
    var lastStr = usciStr.slice(17, 18)
    var signStr = signChar.toString()
    return signStr == lastStr
    }
    BlueSky335
        12
    BlueSky335  
    OP
       2020-01-03 10:18:49 +08:00
    @as80393313 我加进去了,更新了一下
    as80393313
        13
    as80393313  
       2020-01-03 15:03:57 +08:00
    @BlueSky335 嗯,我把它放在我的仓库了。0_0 !
    https://github.com/ChrisDowney1996/validators
    BlueSky335
        14
    BlueSky335  
    OP
       2020-01-03 16:04:14 +08:00
    @as80393313 已经添加链接,并移除了我仓库里的 js 代码。
    as80393313
        15
    as80393313  
       2020-01-03 17:12:45 +08:00
    @BlueSky335 nice!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2772 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 07:26 PVG 15:26 LAX 23:26 JFK 02:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86