身份证后四位是否唯一

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

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

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

非严谨解释

在不进行数据库验证的前提下,我们只是从逻辑上想一下,身份证一共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
        }
    }
])

寄语

数据无情但真实

猜你喜欢

转载自blog.csdn.net/Long861774/article/details/127475038