(哈希查表法)通过学号找身份证号
- 格式:doc
- 大小:42.00 KB
- 文档页数:5
关于学生信息采集系统快速查找身份证重复的方法[5篇材料]第一篇:关于学生信息采集系统快速查找身份证重复的方法关于学生信息采集系统快速查找身份证重复的方法使用以下方法之前确认你的电脑安装了ACCESS数据库软件或有绿色版。
1、进入学生基本信息管理系统(区县级)安装目录下,默认在D盘,找到QxStudent2012.mdb数据库文件。
双击打开,或从ACCESS中选择打开文件。
2、这时提示要求输入密码,密码是illwl。
出现阻止代码之类的提示,选择否,再选择打开。
(切记不要去改动数据库中表的字段结构,否则会影响程序的运行。
)3、这时大家会看到两张表,我们接下来操作的student这张表,另一张是相关的统计数据记录。
4、接下来请选择查询菜单。
5、新建查询。
在设计视图中创建查询,点击新建。
随便选择一种类型。
这时,选择关闭。
再选择视图菜单中的SQL视图。
将以下语句复制进去:SELECT *FROM student AS AAWHERE(Sfzh IN(SELECT sfzh FROM student AS BB WHERE AA.ID <> BB.ID));6、再点击运行图标。
在工具中去找。
接下来马上就出现一个窗口,如果窗口没有出现相关的数据,只出现字段名的话,恭喜你,你的数据库中没有身份证号重复的记录。
否则的出现你的数据就是身份证号码重复的。
7、把数据导出成EXCEL。
选择文件—保存,要求你取一个名称(随便取一个)。
再选择文件—导出,选择文件保存类型,选择好文件保存的位置,取好文件名,点击导出。
8、再打开刚刚导出的EXCEL文件,选择第一张,再选择数据=筛选=自动筛选。
现sfzh一列选择升序或者降序排列。
身份证重复的信息应该很明显了。
查询出生年月不对的信息的SQL语句:SELECT *FROM studentWHERE left(csrq,4)>2012 or mid(csrq,5,2)>12 or right(csrq,2)>31;2012其实也可以改的。
工作中,经常会遇到这样的问题,要在全公司的人员信息表中,找到那么几个人的身份证信息之类的,我们最先想到的解决方案就是,CTRL+F,查找这几个人的信息并一一复制粘贴到想要的地方。
如果两三个人,还好说,如果是从上千条数据中找一百人的信息,这个工作量就非常大了。
其实,用VLookup函数,可以轻松找到自己想要的数据。
请先看演示
VLOOKUP函数应用实例1
解析:
=VLOOKUP(lookup_valuetable_arraycol_index_numrange_lookup)
翻译=Vlookup(找谁,在哪里找?,排第几列,精确查找还是模糊查找)
lookup_value-找谁,我们这次要找的是左边姓名栏的姓名
table_array-在哪里找?这里我们的数据所在区域在A列到B列
col_index_num-排第几列,这里不是说表格的第几列,而是我们选定查找区域的第几列
range_lookup-精确查找还是模糊查找,一般我们输入到这里的时候,电脑会有自动提示,我们选择即可
做完这些工作,只需要按住黑十字往下拉,hoho,所有人的身份证号码都找到了。
拷贝进新表,发给领导交差!!!。
⾝份证号码的规则及验证原理【⾝份证号码的规则】1、15位⾝份证号码组成:ddddddyymmddxxs共15位,其中:dddddd为6位的地⽅代码,根据这6位可以获得该⾝份证号所在地。
yy为2位的年份代码,是⾝份证持有⼈的出⾝年份。
mm为2位的⽉份代码,是⾝份证持有⼈的出⾝⽉份。
dd为2位的⽇期代码,是⾝份证持有⼈的出⾝⽇。
这6位在⼀起组成了⾝份证持有⼈的出⽣⽇期。
xx为2位的顺序码,这个是随机数。
s为1位的性别代码,奇数代表男性,偶数代表⼥性。
2、18位⾝份证号码组成:ddddddyyyymmddxxsp共18位,其中:其他部分都和15位的相同。
年份代码由原来的2位升级到4位。
最后⼀位为校验位。
校验规则是:(1)⼗七位数字本体码加权求和公式S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和Ai:表⽰第i位置上的⾝份证号码数字值Wi:表⽰第i位置上的加权因⼦Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2(2)计算模Y = mod(S, 11)(3)通过模得到对应的校验码Y: 0 1 2 3 4 5 6 7 8 9 10校验码: 1 0 X 9 8 7 6 5 4 3 2也就是说,如果得到余数为1则最后的校验位p应该为对应的0.如果校验位不是,则该⾝份证号码不正确。
以下为js版本的校验实例。
<script language="javascript"><!--var powers=new Array("7","9","10","5","8","4","2","1","6","3","7","9","10","5","8","4","2");var parityBit=new Array("1","0","X","9","8","7","6","5","4","3","2");var sex="male";//校验⾝份证号码的主调⽤function validId(obj){var _id=obj.value;if(_id=="")return;var _valid=false;if(_id.length==15){_valid=validId15(_id);}else if(_id.length==18){_valid=validId18(_id);}if(!_valid){alert("⾝份证号码有误,请检查!");obj.focus();return;}//设置性别var sexSel=document.getElementById("sex");var options=sexSel.options;for(var i=0;i<options.length;i++){if(options[i].value==sex){options[i].selected=true;break;}}}//校验18位的⾝份证号码function validId18(_id){_id=_id+"";var _num=_id.substr(0,17);var _parityBit=_id.substr(17);var _power=0;for(var i=0;i< 17;i++){//校验每⼀位的合法性if(_num.charAt(i)<'0'||_num.charAt(i)>'9'){return false;break;}else{//加权_power+=parseInt(_num.charAt(i))*parseInt(powers[i]);//设置性别if(i==16&&parseInt(_num.charAt(i))%2==0){sex="female";}else{sex="male";}}}//取模var mod=parseInt(_power)%11;if(parityBit[mod]==_parityBit){return true;}return false;}//校验15位的⾝份证号码function validId15(_id){_id=_id+"";for(var i=0;i<_id.length;i++){//校验每⼀位的合法性if(_id.charAt(i)<'0'||_id.charAt(i)>'9'){return false;break;}}var year=_id.substr(6,2);var month=_id.substr(8,2);var day=_id.substr(10,2);var sexBit=_id.substr(14);//校验年份位if(year<'01'||year >'90')return false;//校验⽉份if(month<'01'||month >'12')return false;//校验⽇if(day<'01'||day >'31')return false;//设置性别if(sexBit%2==0){sex="female";}else{sex="male";}return true;}//--></script><input type="text"onblur="validId(this)"maxlength=18 size=18> <select id="sex"><option value="male">男</option><option value="female">⼥</option>。
(WPS表格)解读居民身份证号码15位,在18位,其编码规则按排列顺序从左至右依次为:15位:66位数字出生日期码,3位数字顺序码。
18位:68位数字出生日期码,3位数字顺序码和1位数字校验码。
下面将向用户介绍在中如何进行身份证数据的录入和利用身份证号码进行相关操作,包括以下内容:1.身份证数据的录入;2.身份证号码位数的转换;3.从身份证号码中提取生日;4.从身份证号码中提取性别;1.身份证号码的输入居民身份证号码分别存在15位和18位数字组合(除部分身份证号码以X结尾),那么身份证号码的录入也经常使用户产生困惑。
因此提供以下两种方法供用户进行数据录入:以文本方式录入:首先,设置单元格格式为“文本”,然后进行身份证号码的录入。
前置单撇号进行录入:在输入身份证号码时,先输入单撇号“'”,再输入身份证号即可,如:在单元格中输入:'123456************。
注意:以上两种方法同样可以用于如:帐号、产品编号等长数值的数据录入。
已经录入数据的修改:如果用户直接输入身份证号码,可能用户看到的是以科学计数法来显示的数值,因为在WPS表格中,整数数值仅能保留15位有效数字,而且当用户输入超过11位数值时,系统自动以科学计数法来进行显示。
因此对于这种情况,分别有两种办法来解决:1.已经输入的15位身份证:用户需要重新在单元格格式中进行自定义设置:0,身份证可以完整显示。
2.已经输入的18位身份证:由于整数数值仅能保留15位有效数字,系统除了显示成科学计数法以外,原来录入的数据系统只能保留前15位有效数字,其他3位数字以0显示,数据精度已经丢失。
因此这种数据只能重新录入。
2.15位与18位身份证的相互转换:进入公安局新颁发的居民身份证都是18位。
某些时候用户如果需要将15位身份证和18位身份证位数进行转换(或进行校验),可以使用以下两种方法:15位转换为18位:如:A2单元格为某一15位身份证号码,{=REPLACE(A2,7,,19)&MID("10X98765432",MOD(SUM(MID(REPLACE(A2,7,,19),ROW(IND IRECT("1:17")),1)*2^(18-ROW(INDIRECT("1:17")))),11)+1,1)}利用这个公式的原理,用户还可以对18位身份证进行校验,只需要将公式中“REPLACE(A2,7,,19)”修改为“LEFT(A2,17)”即可。
Excel帮你轻松获取身份证号码隐藏的信息,轻松统计人员基本信息在实际工作中,我们可能会对一些人员的基本信息进行统计,往往我们可能会一项项的输入,其实呢,在Excel中如果我们知道了身份证号,可以利用简单的公式统计出一些具体的个人信息,你比如省份,具体所在地区,出生日期,年龄,性别等。
首先呢,我们先了解一下我国身份证号的编号规律:1-2位代码是指省、自治区、直辖市代码3-4位代码是指地级市、盟、自治州代码5-6位代码是指县、县级市、区代码7-14位代码是指出生年月日15-17位为顺序号,其中第17位如果是奇数指男性,偶数指女性最后一位就是校验码知道这些之后,接下来我们看一下怎样用Excel得到相关信息一、如何得到省份信息。
首先我们需要准备好一份地区代码对照表,这个可以从网上下载,或者是私信我,我发给你们电子版。
将对照表复制到Excel表格中,添加上身份证信息。
然后在省份一栏输入公式。
=VLOOKUP(LEFT(C2,2),A:B,2)解释一下公式:首先LEFT函数是用来对单元格里的内容进行截取选择,从左边第一个字符开始截取,截取指定的长度。
这里的LEFT(C2,2) 就是从C2单元格里面的数值,从左往右截取两位。
VLOOKUP函数就是竖直查找,即列查找。
在指定竖直列区域内查找,找到指定的内容,返回指定列的数据。
这里VLOOKUP(LEFT(C2,2),A:B,2) 就是在A、B列(也就是我们提前准备好的地区代码对照表)查找省份证信息的前两位返回的值是第二列对应的值(这里的第二列就是B列了,不过要注意在使用此函数时,返回第n列的数值不一定对应相应的字母列,这需要我们从选定的区域第一列开始数一下)填完了第一个单元格,鼠标移动到单元格右下角,变成加好时双击或者往下拉就行了。
二、如何得到具体所在地区信息。
公式基本和上面一样,就是利用LEFT函数截取位数时,这次截取前六位的长度。
=VLOOKUP(LEFT(C2,6),A:B,2)三、如何得到出生年月日信息。
三年级数学身份证编码规则及各位表示含义数学作为一门科学,在考察和认识客观事物的本质和规律上具有非常重要的地位。
在数学教育过程中,数学身份证编码规则也接受了广泛的应用和推广。
本文就以三年级学生数学身份证编码规则为例,来结合实际情况,为大家解析各位表示含义。
一、三年级数学身份证编码规则三年级数学身份证编码规则是根据学生在数学方面的表现水平确定的,由18位字符组成,包括11位校园代码,6位学生编号,1位校验位。
1)11位校园代码:前六位代表校本部、校区编号,其中第一位代表家长选择就近入学;第二位代表年级,三/四年级分别用3/4表示;第三位代表班级编号;后四位表示科目类别,数学代码为1000,语文代码为1001,英语代码为1002,物理代码为1003,化学代码为1004,生物代码为1005,地理代码为1006,历史代码为1007。
2) 6位学生编号:由大写字母、数字(0-9)组成,前二位表示学生姓名,后四位表示学生出生年月,前两位表示月份,后两位表示日期。
3) 1位校验位:最后一位数字是校验位,即根据其他信息,由校方计算给出,以验证输入数据的准确性。
二、各位表示含义1) 11位校园代码:用来表示某个学生所在的学校,班级,学科类别等信息,便于校园提供信息管理和准确的考试数据分析和记录。
2) 6位学生编号:用来标识某个学生的身份,使用字母和数字混合编码,便于管理快速准确地辨别学生身份,实现更精准的管理。
3) 1位校验位:校验位使用一个数字,根据输入的信息,有效地验证输入是否正确,当校验位和计算出来的数字不一致,说明输入信息有误,需要进行核实。
三、总结以上就是关于三年级数学身份证编码规则及其各位表示含义的介绍,从中可以看出,数学身份证编码规则在校园管理中起着重要的作用,有效地提升了学校管理的准确性和效率。
希望通过本文能够对大家产生帮助,更加清楚地了解数学身份证编码规则。
详解数据结构之散列(哈希)表1.散列表查找步骤散列表,最有用的基本数据结构之一。
是根据关键码的值直接进行访问的数据结构,散列表的实现常常叫做散列(hasing)。
散列是一种用于以常数平均时间执行插入、删除和查找的技术,下面我们来看一下散列过程。
我们的整个散列过程主要分为两步:1.通过散列函数计算记录的散列地址,并按此散列地址存储该记录。
就好比麻辣鱼,我们就让它在川菜区,糖醋鱼,我们就让它在鲁菜区。
但是我们需要注意的是,无论什么记录我们都需要用同一个散列函数计算地址,然后再存储。
2.当我们查找时,我们通过同样的散列函数计算记录的散列地址,按此散列地址访问该记录。
因为我们存和取的时候用的都是一个散列函数,因此结果肯定相同。
刚才我们在散列过程中提到了散列函数,那么散列函数是什么呢?我们假设某个函数为f,使得存储位置= f (key) ,那样我们就能通过查找关键字不需要比较就可获得需要的记录的存储位置。
这种存储技术被称为散列技术。
散列技术是在通过记录的存储位置和它的关键字之间建立一个确定的对应关系 f ,使得每个关键字key 都对应一个存储位置f(key)。
见下图这里的 f 就是我们所说的散列函数(哈希)函数。
我们利用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间就是我们本文的主人公------散列(哈希)上图为我们描述了用散列函数将关键字映射到散列表。
但是大家有没有考虑到这种情况,那就是将关键字映射到同一个槽中的情况,即f(k4) = f(k3) 时。
这种情况我们将其称之为冲突,k3 和k4 则被称之为散列函数 f 的同义词,如果产生这种情况,则会让我们查找错误。
幸运的是我们能找到有效的方法解决冲突。
首先我们可以对哈希函数下手,我们可以精心设计哈希函数,让其尽可能少的产生冲突,所以我们创建哈希函数时应遵循以下规则:1.必须是一致的。
假设你输入辣子鸡丁时得到的是在看,那么每次输入辣子鸡丁时,得到的也必须为在看。
/*本C语言例程实现了一个简单的哈希查表算法:使用随机函数生成100个学生std[100]的学号与身份证号,分别为studentNum与idNum 通过一个最大能容纳1024个学生的哈希表mHashTable来存储这100个学生的身份资料利用第i个学生独立的学号生成的索引号indexNum = Hash(std[i].studentNum),把对应这个学生的资料存储进哈希表mHashTable.std[indexNum] = std[i];如果需要通过某个学生的学号查询他的身份证号(抑或其他数据比如名字年龄性别什么的),就不需要遍历查询100个学生的学号,只需要利用学号生成索引号indexNum,再把对应mHashTable.std[indexNum] 学生结构体里的数据都拿出来就行了.哈希查表算法的关键在于:1.int Hash(int key) 哈希函数的设计,如何利用特定的数据算出一个索引号,下面是常用算法,需要根据关键字长度,哈希表大小,哈希函数计算时间,记录查找频率等因素来确定使用什么算法.(key是关键字,在本程序中指代studentNum 中的关键数据,我懒了就直接用这个studentNum当关键字)1.1直接定址法: return a*key + b;1.2数字分析法:1.3平方取中法: return (int)(((key*key)>>16)&0x000000ff) 平方后使用中间12位的数据1.4 折叠法:1.5 取模法:return key%512 本程序采用这种方法1.6 随机数法:rand() 函数等2.索引号冲突的处理算法,比如我有学号311422与311934 ,两者通过取模法生成的索引号都是126,由于311422的资料已占据了mHashTable.std[126] ,该如何得出新的索引号以防止311934的资料复写到mHashTable.std[126]里,下面是常用的算法:2.1 开放定址法: indexNum = indexNum + di , di可以是1,2,3到k(k<MAX)或者1,-1,4,-4,9,-9,16,-16,25,-25到k^2 (k^2<MAX) 抑或者是随机数2.2 再哈希法: indexNum = R*Hash(indexNum);2.3 链地址法:所有同索引号的成员资料都存进同一个线性链表里2.4 公共溢出区:把所有冲突者的资料悉数放入另一张哈希表*/#include<stdio.h>#include<stdlib.h>#include<time.h>#define MAX 1024#define EMPTY 0#define EXIST -1#define FULL -2typedef struct {int studentNum;int idNum;}Student;typedef struct{Student *std;int sizeIndex;int studentCount;}HashTable;int Hash(int studentNum){return studentNum%(MAX/2);}void InitHash(HashTable *H){int i;H->std = (Student*)malloc(MAX*sizeof(Student));H->sizeIndex = MAX;H->studentCount = 0;for(i=0;i<MAX;i++){H->std[i].studentNum = 0;H->std[i].idNum = 0;}}int SearchHash(HashTable H,int studentNum,int *indexHash){int count;*indexHash = Hash(studentNum);for(count = 0; count < MAX, *indexHash < MAX; count+=1){ if(H.std[*indexHash].studentNum == 0)return EMPTY;if(H.std[*indexHash].studentNum == studentNum)return EXIST;*indexHash = *indexHash + 1;}return FULL;}int InsertHash(HashTable *H,Student std){int indexHash;int ret = SearchHash(*H,std.studentNum,&indexHash);switch(ret){case EXIST:return EXIST;case EMPTY:H->std[indexHash] = std;H->studentCount ++;break;case FULL:return FULL;}return ret;}void PrintHash(HashTable *H){int i;printf("Start print HashTable:\n");for(i=0;i<MAX;i++){if(H->std[i].studentNum!=0)printf("Hash : std[%d].studentNum = %d , idNum = %d \n",i,H->std[i].studentNum,H->std[i].idNum);}printf("End of HashTable\n");return;}Student* InitStudent(int num){int i;Student *std;std = (Student *)malloc(num*sizeof(Student));for(i=0;i<num;i++){srand((unsigned int )(time(0)*i));std[i].studentNum = rand();srand((unsigned int )(time(0)*std[i].studentNum));std[i].idNum = rand();}return std;}void PrintStudent(Student* std,int num){int i;for(i=0;i<num;i++)printf("std[%d].studentNum = %d, idNum = %d\n",i,std[i].studentNum,std[i].idNum);}int main(){int i;int studentNum;int indexHash;Student *std;HashTable mHashTable;std = InitStudent(100);InitHash(&mHashTable);std[20].studentNum=std[10].studentNum+(MAX/2);i=10;printf("std[%d].studentNum = %d, idNum = %d\n",i,std[i].studentNum,std[i].idNum);i=20;printf("std[%d].studentNum = %d, idNum = %d\n",i,std[i].studentNum,std[i].idNum);//PrintStudent(std,100);for(i=0;i<100;i++)InsertHash(&mHashTable,std[i]);PrintHash(&mHashTable);printf("student count = %d \n",mHashTable.studentCount);while(1){printf("Please use the \"student number\" to find the \"id numer\" :");scanf("%d",&studentNum);if(mHashTable.std[Hash(studentNum)].studentNum == 0)printf("Student number error!\n");if(EXIST == SearchHash(mHashTable,studentNum,&indexHash))printf("\nStudent number %d 's id number is %d \n\n",mHashTable.std[indexHash].studentNum,mHashTable.std[indexHash].idNum);}PrintHash(&mHashTable);return 0;}。