本发明数据存储和检索技术领域,尤其涉及一种支持通配符的纸币冠字号黑名单数据存储和检索方法。
背景技术:
在我国现金流通领域和银行系统内,纸币身份的合法性鉴别和流通追踪是打击伪造、变造国家货币等违法犯罪行为的有力手段,也是维护金融安全的重要保障。少数不法分子非法印刷假币牟取暴利,扰乱市场秩序,严重破坏国家的金融安全。为了能够在自助现金处理设备(如ATM机)上甄除过滤这些假币,及时准确地为广大银行客户提供假币示警,有效地杜绝假币通过ATM机流入银行或者从银行重新流入流通领域,需要发明一种利用纸币冠字号码黑名单,对出入ATM机的纸币现金进行冠字号的对比过滤的系统,将出现在黑名单中的冠字号或者与黑名单中通配符模式的冠字号相匹配的可疑纸币扣留回收,并向正在进行存取款业务的银行客户和银行后台监控系统提供警示信。
为了生成纸币冠字号黑名单,需要将假币冠字号录入到黑名单数据库文件中,由于假币数量庞大,对应的冠字号码亦是海量信息,如果将冠字号一个个按照顺序存储到黑名单文件中,需要庞大的存储空间,且检索十分耗时,检索效率低。
技术实现要素:
本发明的目的是克服目前纸币冠字号黑名单数据存储和检索方法占用存储空间大,检索速度慢的技术问题,提供了一种支持通配符的纸币冠字号黑名单数据存储和检索方法,其采用特殊的数据结构作为黑名单数据库,可以缩减库文件的存储空间,方便添加和删除数据,提高检索速度。
为了解决上述问题,本发明采用以下技术方案予以实现:
本发明的一种支持通配符的纸币冠字号黑名单数据存储方法,包括:
将冠字号分解为m位的号头和n位的号码,构建黑名单数据库文件,黑名单数据库文件包括通配符库、号头位表、号头个数存储区、若干个号头单元和若干个号码单元,号头单元与号码单元一一对应,号码单元包括号码模式记录表和若干个号码存储区;
通配符库,存储有黑名单数据库文件中唯一合法的通配符字符;
号头位表,包括若干位,每一位代表一个特定的号头,且每一位上设置有标识该位代表的号头是否在黑名单数据库文件中的位键值;
号头个数存储区,存储有黑名单数据库文件中号头的总个数;
号头单元,存储有各不相同的号头;
号码单元,每个号码单元与其对应的号头单元存储的号头相关联,存储具有该关联号头的全部号码,号码单元内的每个号码存储区存储有一个号码;
号码模式记录表,将具有相同通配符个数、位置的号码作为一种号码模式,根据号码各位是否为通配符将号码分成2n种号码模式,记录所在号码单元内每一种号码模式对应的号码的个数。
在本技术方案中,将冠字号分解为号头和号码,分别以不同的形式进行存储,并设立表示号头是否存在的号头位表,通过号头单元和号码单元将冠字号完整存储,号码单元存储具有关联号头的全部号码,大大缩减了占用的存储空间。同时,本发明采用的数据结构除了可以存储具体的冠字号码,还可以存储带有若干通配符的冠字号码,即带有通配符的一簇冠字号码的集合,进一步缩减了占用的存储空间。例如,预先在黑名单数据库中存储一个具体的冠字号D06B123456,当ATM机检测出来并在数据库中查询到此冠字号时,即可将该纸币作为可疑币做筛选滤除处理;也可以预先存储一个冠字号D06B******,则表示凡以D06B开头的冠字号,都可以被查询到并当做可疑币处理。
作为优选,所述号头单元包括号头存储区和索引地址,每个号头存储区存储有一个号头,索引地址指向所在号头单元对应的号码单元。
作为优选,所述黑名单数据库文件还包括最大普通冠字号个数存储区、最大特殊冠字号个数存储区、普通冠字号个数存储区和特殊冠字号个数存储区,普通冠字号不含有通配符,特殊冠字号含有通配符。通配符库、最大普通冠字号个数存储区、最大特殊冠字号个数存储区、普通冠字号个数存储区和特殊冠字号个数存储区、号头位表、号头个数存储区、若干个号头单元和若干个号码单元依次顺序存放。
作为优选,号头的每一位的取值都是从26个字母、10个数字和1个通配符中选取的,将号头看作37进制数,设定0-9这10个数字对应的十进制值为本身值,A-Z这26个字母对应的十进制值分别为10-35,通配符对应的十进制值为36,计算出号头对应的十进制数值,号头位表内的第a+1位代表对应十进制数值为a的号头。查询号头是否在黑名单数据库文件中时,计算出号头对应的十进制数值a,查询号头位表内第a+1位的位键值,如果位键值是1代表该号头在黑名单数据库文件中,如果位键值是0代表该号头不在黑名单数据库文件中。
作为优选,号头单元在黑名单数据库文件中的存放顺序是按照其所存储号头的37进制数值升序排列的。便于使用二分检索法查找号头,提高检索速度。
作为优选,号码的每一位的取值都是10个数字和1个通配符中选取的,将号码看作11进制数,设定0-9这10个数字对应的十进制值为本身值,通配符对应的十进制值为10,号码单元内号码存储区的存放顺序是按照其所存储号码的11进制数值升序排列的。便于使用二分检索法查找号码,提高检索速度。
作为优选,号头单元按照其所存储号头的37进制数值升序顺序存放,号码单元按照其关联号头的37进制数值升序顺序存放在号头单元之后,每个号头单元的大小为K1字节,每个号码单元的大小为K2字节;
当需要添加冠字号到黑名单数据库文件时,执行以下步骤:
N1:判断黑名单数据库文件是否为空,如果为空,则添加号头单元和号码单元,根据冠字号的号头设置号头位表,如果不为空,则执行步骤N2;
N2:查询号头位表,判断冠字号的号头是否在黑名单数据库文件中,如果不在黑名单数据库文件中,则执行步骤N3,否则执行步骤N4;
N3:将号头位表内对应位的位键值置1,将号头个数存储区内的号头个数加1,确定号头单元的插入位置并添加号头单元,确定号码单元的插入位置并添加号码单元,更新号码模式记录表,将该号头单元之前的所有号头单元的索引地址加K1,将该号头单元之后的所有号头单元的索引地址加K3,K3=K1+K2;
N4:查找出存储该号头的号头单元对应的号码单元,判断冠字号的号码是否在号码单元中,如果在号码单元中,则添加步骤结束,否则,添加号码,并更新号码模式记录表,将该号头单元之后的所有号头单元的索引地址加K2。
作为优选,当需要删除黑名单数据库文件中的冠字号时,执行以下步骤:
M1:判断黑名单数据库文件是否为空,如果为空,则删除失败,如果不为空,则执行步骤M2;
M2:查询号头位表,判断冠字号的号头是否在黑名单数据库文件中,如果不在黑名单数据库文件中,则删除失败,否则执行步骤M3;
M3:查找出存储该号头的号头单元对应的号码单元,判断冠字号的号码是否在号码单元中,如果不在号码单元中,则删除失败,如果在号码单元中则执行步骤M4;
M4:如果该号头单元是所有号头单元的最后一个且该号码单元只有一个号码,则将号头位表内对应位的位键值置0,将号头个数存储区内的号头个数减1,删除该号头单元和该号码单元,该号头单元之前的所有号头单元的索引地址减K1;
如果该号头单元不是所有号头单元的最后一个且该号码单元只有一个号码,则将号头位表内对应位的位键值置0,将号头个数存储区内的号头个数减1,删除该号头单元和该号码单元,该号头单元之前的所有号头单元的索引地址减K1,该号头单元之后的所有号头单元的索引地址减K3,K3=K1+K2;
如果该号头单元是所有号头单元的最后一个且该号码单元有多个号码,则删除该号码单元中对应的号码,更新号码模式记录表;
如果该号头单元不是所有号头单元的最后一个且该号码单元有多个号码,则删除该号码单元中对应的号码,更新号码模式记录表,该号头单元之后的所有号头单元的索引地址减K2。
黑名单数据库文件中的数据顺序存放,删除冠字号时,内部数据自动调整存储地址和索引地址,缩减存储空间。
本发明的一种基于上述的一种支持通配符的纸币冠字号黑名单数据存储方法的数据检索方法,包括:
S1:读取输入的待查冠字号,取出待查冠字号的号头,该号头为不含通配符的普通号头,将号头中的一位或多位上的数值用通配符替换,得到2m -1个含有通配符的不同特殊号头,将普通号头和特殊号头作为待查号头;
S2:依次查询每个待查号头在号头位表中对应位的位键值,根据位键值判断待查号头是否存储在黑名单数据库文件中,当查询到某个待查号头存储在黑名单数据库文件中时,执行步骤S3,如果所有待查号头都没有存储在黑名单数据库文件中,则输出待查冠字号不在黑名单中的信息;
S3:取出待查冠字号的号码,该号码为不含通配符的普通号码,将号码中的一位或多位上的数值用通配符替换,得到2n -1个含有通配符的不同特殊号码,将普通号码和特殊号码作为待查号码;
查找出存储该待查号头的号头单元对应的号码单元,依次查询该号码单元的号码模式记录表中每种号码模式对应的号码的个数,当查询到某种号码模式对应的号码个数大于0时,获取属于该号码模式的待查号码,查询号码单元内是否存储有该待查号码,如果存在,则输出待查冠字号在黑名单中的信息,并结束查询,否则继续查询剩余未查询的号码模式对应的号码的个数;
当号码模式记录表中的所有号码模式都被查询过时,如果号码单元内没有存储任何一个待查号码,则输出待查冠字号不在黑名单中的信息。
本发明的有益效果是:采用特殊的数据结构作为黑名单数据库,除了可以存储具体的冠字号码,还可以存储带有若干通配符的冠字号码,即带有通配符的一簇冠字号码的集合,可以缩减库文件的存储空间,方便添加和删除数据,提高检索速度。
附图说明
图1是黑名单数据库文件的存储结构示意图;
图2是黑名单冠字号的添加流程;
图3是黑名单冠字号的删除流程。
具体实施方式
下面通过实施例,并结合附图,对本发明的技术方案作进一步具体的说明。
实施例:本实施例的一种支持通配符的纸币冠字号黑名单数据存储方法,包括:
将冠字号分解为m位的号头和n位的号码,构建黑名单数据库文件,如图1所示,黑名单数据库文件包括依次顺序存放的通配符库、最大普通冠字号个数存储区、最大特殊冠字号个数存储区、普通冠字号个数存储区、特殊冠字号个数存储区、号头位表、号头个数存储区、若干个号头单元和若干个号码单元,普通冠字号不含有通配符,特殊冠字号含有通配符,号头单元与号码单元一一对应,号码单元包括号码模式记录表和若干个号码存储区;
通配符库,存储有黑名单数据库文件中唯一合法的通配符字符的ASCII码;
号头位表,包括若干位,每一位代表一个特定的号头,且每一位上设置有标识该位代表的号头是否在黑名单数据库文件中的位键值;
号头个数存储区,存储有黑名单数据库文件中号头的总个数;
号头单元,存储有各不相同的号头;号头单元包括号头存储区和索引地址,每个号头存储区存储有一个号头,索引地址指向所在号头单元对应的号码单元;
号码单元,每个号码单元与其对应的号头单元存储的号头相关联,存储具有该关联号头的全部号码,号码单元内的每个号码存储区存储有一个号码;
号码模式记录表,将具有相同通配符个数、位置的号码作为一种号码模式,根据号码各位是否为通配符将号码分成2n种号码模式,记录所在号码单元内每一种号码模式对应的号码的个数。
将冠字号分解为号头和号码,分别以不同的形式进行存储,并设立表示号头是否存在的号头位表,通过号头单元和号码单元将冠字号完整存储,号码单元存储具有关联号头的全部号码,大大缩减了占用的存储空间。同时,本发明采用的数据结构除了可以存储具体的冠字号码,还可以存储带有若干通配符的冠字号码,即带有通配符的一簇冠字号码的集合,进一步缩减了占用的存储空间。例如,预先在黑名单数据库中存储一个具体的冠字号D06B123456,当ATM机检测出来并在数据库中查询到此冠字号时,即可将该纸币作为可疑币做筛选滤除处理;也可以预先存储一个冠字号D06B******,则表示凡以D06B开头的冠字号,都可以被查询到并当做可疑币处理。
因为n位号码中含有通配符的可能情况是2n个,所以有2n种号码模式。例如12345*和54335*中通配符都在第六位,属于同一种号码模式;12*45*和54*35*中通配符都在第三、六位,属于同一种号码模式。
号头的每一位的取值都是从26个字母、10个数字和1个通配符中选取的,将号头看作37进制数,设定0-9这10个数字对应的十进制值为本身值,A-Z这26个字母对应的十进制值分别为10-35,通配符对应的十进制值为36,计算出号头对应的十进制数值,号头位表内的第a+1位代表对应十进制数值为a的号头。例如:号头D0*B在号头位表的第13*373+0*372+36*37+11+1位,如果该位的位键值是1代表该号头在黑名单数据库文件中,如果该位的位键值是0代表该号头不在黑名单数据库文件中。
号头单元在黑名单数据库文件中的存放顺序是按照其所存储号头的37进制数值升序排列的。便于使用二分检索法查找号头,提高检索速度。
号码的每一位的取值都是10个数字和1个通配符中选取的,将号码看作11进制数,设定0-9这10个数字对应的十进制值为本身值,通配符对应的十进制值为10,号码单元内号码存储区的存放顺序是按照其所存储号码的11进制数值升序排列的。便于使用二分检索法查找号码,提高检索速度。
号头单元按照其所存储号头的37进制数值升序顺序存放,号码单元按照其关联号头的37进制数值升序顺序存放在号头单元之后,每个号头单元的大小为K1字节,每个号码单元的大小为K2字节;
如图2所示,当需要添加冠字号到黑名单数据库文件时,执行以下步骤:
N1:判断黑名单数据库文件是否为空,如果为空,则添加号头单元和号码单元,设置号头位表、索引地址、号头个数、号码模式记录表,如果不为空,则执行步骤N2;
N2:查询号头位表,判断冠字号的号头是否在黑名单数据库文件中,如果不在黑名单数据库文件中,则执行步骤N3,否则执行步骤N4;
N3:将号头位表内对应位的位键值置1,将号头个数存储区内的号头个数加1,确定号头单元的插入位置并添加号头单元,确定号码单元的插入位置并添加号码单元,更新号码模式记录表,将该号头单元之前的所有号头单元的索引地址加K1,将该号头单元之后的所有号头单元的索引地址加K3,K3=K1+K2;
N4:查找出存储该号头的号头单元对应的号码单元,判断冠字号的号码是否在号码单元中,如果在号码单元中,则添加步骤结束,否则,添加号码,并更新号码模式记录表,将该号头单元之后的所有号头单元的索引地址加K2。
如图3所示,当需要删除黑名单数据库文件中的冠字号时,执行以下步骤:
M1:判断黑名单数据库文件是否为空,如果为空,则删除失败,如果不为空,则执行步骤M2;
M2:查询号头位表,判断冠字号的号头是否在黑名单数据库文件中,如果不在黑名单数据库文件中,则删除失败,否则执行步骤M3;
M3:查找出存储该号头的号头单元对应的号码单元,判断冠字号的号码是否在号码单元中,如果不在号码单元中,则删除失败,如果在号码单元中则执行步骤M4;
M4:如果该号头单元是所有号头单元的最后一个且该号码单元只有一个号码,则将号头位表内对应位的位键值置0,将号头个数存储区内的号头个数减1,删除该号头单元和该号码单元,该号头单元之前的所有号头单元的索引地址减K1;
如果该号头单元不是所有号头单元的最后一个且该号码单元只有一个号码,则将号头位表内对应位的位键值置0,将号头个数存储区内的号头个数减1,删除该号头单元和该号码单元,该号头单元之前的所有号头单元的索引地址减K1,该号头单元之后的所有号头单元的索引地址减K3,K3=K1+K2;
如果该号头单元是所有号头单元的最后一个且该号码单元有多个号码,则删除该号码单元中对应的号码,更新号码模式记录表;
如果该号头单元不是所有号头单元的最后一个且该号码单元有多个号码,则删除该号码单元中对应的号码,更新号码模式记录表,该号头单元之后的所有号头单元的索引地址减K2。
黑名单数据库文件中的数据顺序存放,删除冠字号时,内部数据自动调整存储地址和索引地址,缩减存储空间。
本实施例的一种基于上述的一种支持通配符的纸币冠字号黑名单数据存储方法的数据检索方法,包括:
S1:读取输入的待查冠字号(待查冠字号不含有通配符),判断黑名单数据库文件是否为空,如果为空,则检索失败,如果不为空,则取出待查冠字号的号头,该号头为不含通配符的普通号头,将号头中的一位或多位上的数值用通配符替换,得到2m -1个含有通配符的不同特殊号头,将普通号头和特殊号头作为待查号头;
S2:依次查询每个待查号头在号头位表中对应位的位键值,根据位键值判断待查号头是否存储在黑名单数据库文件中,当查询到某个待查号头存储在黑名单数据库文件中时,执行步骤S3,如果所有待查号头都没有存储在黑名单数据库文件中,则输出待查冠字号不在黑名单中的信息;
S3:取出待查冠字号的号码,该号码为不含通配符的普通号码,将号码中的一位或多位上的数值用通配符替换,得到2n -1个含有通配符的不同特殊号码,将普通号码和特殊号码作为待查号码;
查找出存储该待查号头的号头单元对应的号码单元,依次查询该号码单元的号码模式记录表中每种号码模式对应的号码的个数,当查询到某种号码模式对应的号码个数大于0时,获取属于该号码模式的待查号码,采用二分查找方法查询号码单元内是否存储有该待查号码,如果存在,则输出待查冠字号在黑名单中的信息,并结束查询,否则继续查询剩余未查询的号码模式对应的号码的个数;
当号码模式记录表中的所有号码模式都被查询过时,如果号码单元内没有存储任何一个待查号码,则输出待查冠字号不在黑名单中的信息。
以人民币为例说明纸币冠字号黑名单数据存储方法和检索方法:人民币冠字号码由4位号头和6位号码组成,号头中每一位都可能包含26个字母、10个阿拉伯数字和1个通配符;而号码中的每一位仅包含10个数字或1个通配符。
黑名单数据库文件进行如下设定:通配符库大小为1byte,通配符设置为‘*’。最大普通冠字号个数存储区、最大特殊冠字号个数存储区、普通冠字号个数存储区、特殊冠字号个数存储区、号头个数存储区大小都为4bytes。号头位表中每一位大小为1bit。号头单元大小为8bytes,号头存储区大小为4bytes,索引地址大小为4bytes。
号码单元的大小为268bytes。每个号码存储区大小为4bytes。号码模式记录表大小为256bytes,包含64个字段,每个字段4bytes,每个字段代表一种号码模式。因为6位号码中含有通配符的可能情况是26个,所以采用64个字段来分别记录所对应号码模式在该号码单元中对应的号码的个数。例如,一个号码单元中存储着2个号码123456、654321、12345*、11223*和1234*6。由于123456和654321为同样一种号码模式,则将模式记录表中第一个字段置为2;由于12345*和11223*为同样一种号码模式,则将模式记录表中第二个字段置2;而号码模式1234*6属于另外一种号码模式,则将表中对应该模式的第三个字段置1。
添加冠字号D0*B1234*6到黑名单数据库文件的步骤为:
N1:判断黑名单数据库文件是否为空,如果为空,则添加号头单元和号码单元,根据冠字号的号头设置号头位表,如果不为空,则执行步骤N2;
N2:查询号头位表,号头D0*B在号头位表的第13*373+0*372+36*37+11+1位,如果该位的位键值是1代表该号头在黑名单数据库文件中,执行步骤N4,如果该位的位键值是0代表该号头不在黑名单数据库文件中,执行步骤N3;
N3:将号头位表内对应位的位键值置1,将号头个数存储区内的号头个数加1,确定号头单元的插入位置并添加号头单元,确定号码单元的插入位置并添加号码单元,更新号码模式记录表,将该号头单元之前的所有号头单元的索引地址加8bytes,将该号头单元之后的所有号头单元的索引地址加276bytes;
N4:查找出存储该号头的号头单元对应的号码单元,判断冠字号的号码是否在号码单元中,如果在号码单元中,则添加步骤结束,否则,添加号码,并更新号码模式记录表,将该号头单元之后的所有号头单元的索引地址加268bytes。
检索冠字号D06B123456是否在黑名单中的步骤为:
S1:判断黑名单数据库文件是否为空,如果为空,则检索失败,如果不为空,则取出待查冠字号的号头D06B,该号头为不含通配符的普通号头,将号头中的一位或多位上的数值用通配符替换,得到15个含有通配符的不同特殊号头,即D06*、D0*B、D0**、D*6B、D*6*、D**B、D***、*06B、*06*、*0*B、*0**、**6B、**6*、***B、****,将普通号头和特殊号头作为待查号头;
S2:依次查询每个待查号头在号头位表中对应位的位键值,根据位键值判断待查号头是否存储在黑名单数据库文件中,当查询到某个待查号头存储在黑名单数据库文件中时,执行步骤S3,如果所有待查号头都没有存储在黑名单数据库文件中,则输出待查冠字号不在黑名单中的信息;
S3:取出待查冠字号的号码123456,该号码为不含通配符的普通号码,将号码中的一位或多位上的数值用通配符替换,得到63个含有通配符的不同特殊号码,即12345*、1234*6、1234**、123*56、123*5*、123**6、123***、12*456、12*45*等,将普通号码和特殊号码作为待查号码;
查找出存储该待查号头的号头单元对应的号码单元,依次查询该号码单元的号码模式记录表中每种号码模式对应的号码的个数,当查询到某种号码模式对应的号码个数大于0时,获取属于该号码模式的待查号码,采用二分查找方法查询号码单元内是否存储有该待查号码,如果存在,则输出待查冠字号在黑名单中的信息,并结束查询,否则继续查询剩余未查询的号码模式对应的号码的个数;
当号码模式记录表中的所有号码模式都被查询过时,如果号码单元内没有存储任何一个待查号码,则输出待查冠字号不在黑名单中的信息。