身份证后四位是否唯一?

简介: 身份证后四位是否唯一?

众所周知,身份证是唯一的。

但是有一个人突然问到,我们数据库中的身份证后四位是唯一的吗?能否查询一下数据库?

这个问题,我的第一反应是,当然不唯一了。

非严谨解释

在不进行数据库验证的前提下,我们只是从逻辑上想一下,身份证一共18位,后四位,即生日后的四位数,那么即使再怎么排列,最多也就是 101010*11个组合,肯定是会重复的。

严谨解释

我们再从严谨的逻辑来理解一下

身份证的排列规则:
身份证号码是由18位数字组成
第1、2位数字表示:所在省份的代码
第3、4位数字表示:所在城市的代码
第5、6位数字表示:所在区县的代码
第7-14位数字表示:出生年、月、日(其中7、8、9、10位是年,11、12位是月,13、14位是日)
第15-17位都是同一地址辖区内的,以及同年同月同日出生人的顺序码,同时第17位兼具性别标识功能,男单女双
第18位数字是校检码:可以是0-9的数字,有时也用X表示

所以,在不同的省市区,身份证后四位是可以重复的。

数据库验证

是的,我们是程序员,当理论无法让人接受的时候,我们可以使用数据来说服他人。
这里我的数据库是mongo数据库,所以,我的查询语句如下

db.user.aggregate([
    {
        $match: {
            //请原谅数据库中那些不规范的身份证号
            card_id: {
                $exists: true,
                $nin: ["", null]
            }
        }
    },
    {
        $project: {
            "_id": 1,
            "name": 1,
            "card_id": 1,
            "card_id_info": {
                $substr: ["$card_id", 14, 4]
            }
        }
    },
    //请原谅数据库中那些不规范的身份证号
    {
        $match: {
            card_id_info: {
                $nin: ["", null]
            }
        }
    },
    {
        $group: {
            _id: "$card_id_info",
            count: {
                $sum: 1
            },
                        //增加输出
            uniqueIds: {
                "$addToSet": {
                    _id: "$_id",
                    name: "$name",
                    card_id: "$card_id",
                    card_id_info: "$card_id_info"
                }
            }
        }
    },
    {
        //让我们看看重复的多的是哪些
        $sort: {
            count:  - 1
        }
    }
])

寄语

数据无情但真实

目录
相关文章
|
7月前
|
数据安全/隐私保护
常用的表单校验规则——邮箱/QQ/身份证号码/微信/电话/数字字母/整数/文本/密码等
常用的表单校验规则——邮箱/QQ/身份证号码/微信/电话/数字字母/整数/文本/密码等
189 0
|
6月前
17. 电话号码的字母组合
17. 电话号码的字母组合
|
7月前
|
存储 算法
17.电话号码的字母组合
17.电话号码的字母组合
38 0
|
JavaScript 前端开发
身份证第18位校验码如何计算
身份证第18位校验码如何计算
87 0
|
存储 C++ 索引
电话号码的字母组合(C++实现)
电话号码的字母组合(C++实现)
76 0
PTA 1031 查验身份证 (15 分)
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
197 0
手机号中间四位加星号
手机号中间四位加星号
152 0
L1-016 查验身份证 (15 分)
L1-016 查验身份证 (15 分)
166 0