发明内容
本发明的实施例提供一种字典压缩的方法和装置,用于解决字典压缩的过程中字典压缩模块需要占用的存储空间过大的问题。
为达到上述目的,本发明的实施例采用如下技术方案:
第一方面,本发明实施例提供了一种字典压缩的方法,该方法包括:
获取通信报文中第一字串的个数占总字串个数的比值x,其中,所述通信报文中的每个字串都由m个字符组成,所述第一字串是由关键字符组成的字串,所述关键字符的个数为n,字典的大小为H;
判断n的m次方是否小于H*x;
若是,分别为第一哈希链表头和第二哈希链表头分配存储空间,其中,所述第一哈希链表头的存储空间大小为n的m次方,所述第二哈希链表头的存储空间为H*(1-x);
判断所述通信报文中的第二字串是否属于所述第一字串;
若是,通过第一哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第一哈希链表头中;
若不是,通过第二哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。
在第一种可能的实施方式中,结合第一方面,所述获取通信报文中第一字串的个数占总字串个数的比值x之前,该方法还包括:
按照出现次数由大到小的顺序,获取所述通信报文的L个字符中的前n个字符作为所述关键字符,其中,所述L个字符为所述通信报文中所有两两不同的字符。
在第二种可能的实施方式中,结合第一种可能的实施方式,所述按照出现次数由大到小的顺序,获取所述通信报文的L个字符中的前n个字符作为所述关键字符之后,该方法还包括:
设置第1至第M个关键字符组,所述每个关键字符组中的字符都属于所述n个字符,所述每个关键字符组中的字符数小于n,所述M大于等于2;
获取所述通信报文中第三字串的个数占总字串个数的比值y,其中,所述第三字串是由所述第1至第M个关键字符组中的任一关键字符组中的字符组成的字串,所述通信报文中的每个字串都由m个字符组成,字典的大小为H;
获取第1至M个关键字符组中每个关键字符组的关键字符的个数的m次方的和值T;
判断所述和值T是否小于H*y;
若是,为每个关键字符组分配对应的哈希链表头的存储空间,并为所述第二哈希链表头分配存储空间,其中,所述第N个关键字符组所对应的哈希链表头的存储空间的大小为t的m次方,其中,所述t为所述第N个关键字符组中关键字符的个数,所述第二哈希链表头的存储空间的大小为H*(1-y);
判断所述通信报文中的第二字串是否是由第N个关键字符组中的字符组成的,其中,所述1<=N<=M;
若是,通过所述第N个关键字符组所对应的哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入所述第N个关键字符组所对应的哈希链表头中;
若不是,通过所述第二哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。
在第三种可能的实施方式中,结合第二种可能的实施方式,所述第N个关键字符组所对应的哈希函数为全映射函数或非全映射函数,所述第二哈希函数为非全映射函数。
第二方面,本发明实施例提供了一种字典压缩的装置,该装置包括:第一获取单元,第一判断单元、分配单元、第二判断单元和计算单元;
所述第一获取单元,用于获取通信报文中第一字串的个数占总字串个数的比值x,其中,所述通信报文中的每个字串都由m个字符组成,所述第一字串是由关键字符组成的字串,所述关键字符的个数为n,字典的大小为H;
所述第一判断单元,用于判断n的m次方是否小于H*x;
所述分配单元,用于分别为第一哈希链表头和第二哈希链表头分配存储空间,其中,所述第一哈希链表头的存储空间大小为n的m次方,所述第二哈希链表头的存储空间为H*(1-x);
所述第二判断单元,用于判断所述通信报文中的第二字串是否属于所述第一字串;
所述计算单元,用于若是,通过第一哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第一哈希链表头中;
若不是,通过第二哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。
在第一种可能的实施方式中,结合第二方面,该装置还包括:第二获取单元;
所述第二获取单元,用于按照出现次数由大到小的顺序,获取所述通信报文的L个字符中的前n个字符作为所述关键字符,其中,所述L个字符为所述通信报文中所有两两不同的字符。
在第二种可能的实施方式中,结合第一种可能的实施方式,该装置还包括:设置单元;
所述设置单元,用于设置第1至第M个关键字符组,所述每个关键字符组中的字符都属于所述n个字符,所述每个关键字符组中的字符数小于n,所述M大于等于2;
所述第一获取单元,还用于获取所述通信报文中第三字串的个数占总字串个数的比值y,其中,所述第三字串是由所述第1至第M个关键字符组中的任一关键字符组中的字符组成的字串,所述通信报文中的每个字串都由m个字符组成,字典的大小为H;
获取第1至M个关键字符组中每个关键字符组的关键字符的个数的m次方的和值T;
所述第一判断单元,用于判断所述和值T是否小于H*y;
所述分配单元,用于为每个关键字符组分配对应的哈希链表头的存储空间,并为所述第二哈希链表头分配存储空间,其中,所述第N个关键字符组所对应的哈希链表头的存储空间的大小为t的m次方,其中,所述t为所述第N个关键字符组中关键字符的个数,所述第二哈希链表头的存储空间的大小为H*(1-y);
所述第二判断单元,用于判断所述通信报文中的第二字串是否是由第N个关键字符组中的字符组成的,其中,所述1<=N<=M;
所述计算单元,用于若是,通过所述第N个关键字符组所对应的哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入所述第N个关键字符组所对应的哈希链表头中;
若不是,通过所述第二哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。
在第三种可能的实施方式中,结合第二种可能的实施方式,所述第N个关键字符组所对应的哈希函数为全映射函数或非全映射函数,所述第二哈希函数为非全映射函数。
本发明实施例提供了一种字典压缩的方法和装置,该方法包括:获取通信报文中第一字串的个数占总字串个数的比值x,其中,所述通信报文中的每个字串都由m个字符组成,所述第一字串是由关键字符组成的字串,所述关键字符的个数为n,字典的大小为H;判断n的m次方是否小于H*x;若是,分别为第一哈希链表头和第二哈希链表头分配存储空间,其中,所述第一哈希链表头的存储空间大小为n的m次方,所述第二哈希链表头的存储空间为H*(1-x);判断所述通信报文中的第二字串是否属于所述第一字串;若是,通过第一哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第一哈希链表头中;若不是,通过第二哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。通过该方法,可得第一哈希链表头与第二哈希链表头的和值为nm+H(1-x),由因为nm<H*x,则nm+H(1-x)<H,即通过本发明方案得到的总的哈希链表头所占用的存储空间小于现有技术中哈希链表头所占用的存储空间,并且,若所述第一哈希函数为全映射函数,可以使得第一哈希链表头中的哈希冲突为0,与现有技术相比,降低了总的哈希冲突。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在现有技术中,举例来说,对于字串the brown fox jumped over the brownfoxy jumping frog进行压缩,压缩过程如下:
通过预设的哈希函数计算每个字符的哈希值,将字符t放入历史数据窗口,成为字典的一部分,计算字符t的哈希值,将t的哈希值以及t在历史数据窗口的位置存放在哈希链表头中,在哈希链表头以及哈希链表中查找没有与t的哈希值相同的字符,则将t由输出模块输出;
依次的,将字符h,e,空格,b,r,o,w,n,空格,f,o,x,空格,j,u,m,p,e,d,空格o,v,e,r,空格进行与上述字符t相同的处理过程,并由输出模块将上述字符依次输出(前后只有一个字符相同的不做压缩,例如,前面有一个字符o,后面有一个字符o,但前面的字符o的下一个字符与后一个字符o的下一个字符不同,此时不将后面的字符o进行压缩)。
此时,历史数据窗口中有26个字符,即字典有26个字符,分别为t h e \x20 (空格) b r o w n \x20 (空格) f o x \x20 (空格) j u m p e d \x20 (空格) o v e r \x20(空格),这26个字符在历史数据窗口的位置为0至25。
字典中的每个字符的地址信息如下:
t:0表示以t为起始索引的字典出现在历史数据窗口的0位置;
h:1表示以h为起始索引的字典出现在历史数据窗口的1位置;
e:23,18,2表示以e为起始索引的字典出现在历史数据窗口的位置为23,18和2;
\x20(空格):25,20,13,9,3表示以空格为起始索引的字典出现在历史数据窗口的位置为25,20,13,9和3;
同样的,还有以b、r、o、w、n、f、x、j、u、m、p、d、v这几个字符为起始索引的字典出现在历史数据窗口中的位置。
具体的,举例来说,假设哈希函数为f=(int)x%15,即将一个字符转换为ASCII码值(0-255)x后,再将其值除以15,然后将除以15后的余数取整。其中,\x20b d e f h j m no p r t u v w x的ASCII码根据ASCII码表查得分别为:32、98、100、101、102、104、106、109、110、111、112、114、116、117、118、119和120,通过哈希函数的计算,结果如下表1-1:
表1-1
上述表1-1可以转换为如图1所示的格式:
即哈希值为0的字符为x,x在历史数据窗口的位置为12,哈希值为1的字符为j,j在历史数据窗口的位置为14,哈希值为2的字符为\x20,\x20在历史数据窗口的位置为25、20、13、9和3…哈希值为14的字符为h和w,所述h和w在历史数据窗口的位置为7和1。
表示为哈希链表头和哈希链表的形式即为如图2所示,其中,head表示哈希链表头,pre表示哈希链表。
结合head和prev,Head[0]=12,prev[12]=NULL,其中,NULL表示空,即哈希值为0的字符在历史数据窗口的位置为12;
Head[1]=14, prev[14]=NULL,即哈希值为1的字符在历史数据窗口的位置为14;
Head[2]=25, prev[25]=20, prev[20]=13, prev[13]=9,prev[9]=3, prev[3]=NULL,即哈希值为2的字符在历史数据窗口的位置为25,20,13,9和3;
…
Head[14]=7, prev[7]=1, prev[1]=NULL,即哈希值为14的字符在历史数据窗口的位置为7和1。
这样,获得一个字符的哈希值,就可以通过该哈希值获得该字符在历史数据窗口的位置(地址信息)。
至此,字典中有26个字符,在哈希链表和哈希链表头中有这26个字符中每个字符的哈希值与每个字符的地址信息的对应关系。接着,按照上述步骤,将字串the brown foxjumped over the brown foxy jumping frog中的第27个字符,即字符t放入历史数据窗口中,通过哈希函数为f=(int)x%15计算t的哈希值,得到t的哈希值为11,则根据图2,Head[11]=23,prev[23]=18, prev[18]=2, prev[2]=0,prev[0]=NULL,则哈希值为11的字符在历史数据窗口的位置为23、18、2、和0,则依次取出字典中位置为23、18、2和0位置为起始位置的字串进行比较:
23:er the brown foxy jumping frog
18:ed over the brown foxy jumping frog
2:e brown fox jumped over the brown foxy jumping frog
0:the brown fox jumped over the brown foxy jumping frog
当前位置的字串为:
27(当前位置):the brown foxy jumping frog
将当前位置的字串一次与从位置23开始的字串,从位置18开始的字串,从位置2开始的字串和从位置0开始的字串进行匹配,可得从位置0可以匹配到一个长字串the brownfox,匹配的字串长度为13,可以看到在0位置可以匹配到一串长的匹配,匹配长度为13。那么当前这13个字符用13(匹配到的字串的长度),26(回退26个位置)表示,表示当前的字符子串(长度13)与回退26个位置的13个字符是一致的,解压缩可以,回退26个位置开始取13个字符到这里。
即:前一个序列的the brown fox出现在26个字符之前,序列的长度是13个字符。此时,可以通过编码的方式将以第27个字符t开头的长度为13的字串进行压缩,例如,假定存在两种编码选项:8bit的指针和4bit的长度,或者12bit的指针和6bit的长度。使用2bit的首部来指示选择了哪种选项,00表示第一种选项,01表示第二种选项。因此,the brownfox的第二次出现被编码为<00b><26d><13d>,或者00 00011010 1101,即用编码<00b><26d><13d>或00 00011010 1101代替第二次出现的字串the brown fox从输出模块输出,从而达到了将一个字串进行压缩的目的。
当然,the brown fox中的字符t以后的12个字符he brown fox,也应该依次将每个字符放入历史数据窗口中成为字典的一部分,并一次计算每个字符的哈希值,将其在历史数据窗口的地址信息根据哈希值存储哈希链表头或哈希链表中。
当然,在实际的压缩过程中,通常不会依次计算每个字符的哈希值,因为这样计算以及匹配的次数太多,一般情况下,会通过哈希函数计算一个字串的哈希值,并将根据该字串的哈希值将该字串在历史数据窗口的地址信息存储哈希链表头或哈希链表中。
结合上述背景知识,本发明实施例提供了一种字典压缩的方法,结合图3,该方法包括:
301、获取通信报文中第一字串的个数占总字串个数的比值x,其中,所述通信报文中的每个字串都由m个字符组成,所述第一字串是由关键字符组成的字串,所述关键字符的个数为n,字典的大小为H。
按照齐普夫定律,文档中的单词按照出现的次数排序,y是排名第x的单词在文档中出现的次数,那么有公式y=cx^(-1/2),c是常数。排名越靠后,出现次数成指数下降。那么对于一个文档中的字符有更明显的指数递减现象。
因此,可以将一个通信报文中的L个字符按照出现频率由大到小的顺序进行排序,获取排序结果中的前n个字符作为关键字符,其中,所述L个字符为所述通信报文中所有两两不同的字符。
遍历所述通信报文中的所有字串,获取第一字串的个数与总字串的个数,其中,所述第一字串是包含的字符都是预设的关键字符的字串,获取所述第一字串占所述通信报文中总字串的比值x,其中,所述通信报文中的每个字串都由m个字符组成,具体的,通常m为3。
当然,对于每个通信报文,在压缩之前可以通过上述方法获取该报文的n个关键字符,也可以先通过上述方法获取第一报文的n个关键字符,当对第二报文进行压缩时,判断第二报文是否与所述第一报文预设相关,例如,所述第二报文与所述第一报文都是描述同一事物的报文,则对所述第二报文进行压缩时,可以将通过所述第一报文获取的n个关键字符作为所述第二报文的n个关键字符。
还可以对某一类报文,预设该类报文的n个关键字符,在对一个通信报文进行压缩时,判断该通信报文是否属于该类报文,若是,则将预设的该类通信报文的n个关键字符作为所述待压缩的通信报文的n个关键字符,具体的,还可以通过其他方式设置所述n个关键字符,本发明实施例对比不做限定。
302、判断n的m次方是否小于H*x。
在现有技术中,字典的大小为历史数据窗口,通常设置为16K或者32K,哈希链表头和哈希链表的大小通常与字典大小一致,也是历史数据窗口的大小。
其中,将哈希链表头设置为历史数据窗口大小的原因是:在现有技术中,通常用一个字串(3个字符)做索引,由于共有256个字符的种类,则3个字符组成的字串的所有组合有2563=224,即16M,若使用全映射函数计算每个字串的哈希值,则所需要的哈希链表头的存储空间应为16M大小(需要说明的是,结合图1,在哈希链表头中,哈希值有一定的排列顺序,例如,哈希值为2的字符的在历史数据窗口的地址信息被存放字哈希值2所对应的存储空间中,哈希值为4的字符在历史数据窗口的地址信息被存放在哈希值4所对应的存储空间中,字典中虽然没有哈希值为3的字符,但哈希值3以及哈希值为3所对应的存储空间是必须要被分配的,因此,若使用全映射函数,则实际被占用的哈希链表头的存储空间为16M),所占用的存储空间过大,因此,在现有技术中,通常用非全映射函数计算每个字串的哈希值。
需要说明的是,全映射哈希函数的输入和输出是一一对应的关系,即通过一个字串,可以唯一确定该字串的哈希值,通过一个哈希值,也可以唯一确定一个字串;而非全映射的哈希函数,可能会出现两个或者多个字串对应一个哈希值的情况,此时,就有可能就会造成哈希冲突。
举例来说,上述例子中对字串he brown fox jumped over the brown foxyjumping frog进行压缩的过程中,在第二步建立字典索引的过程中,所取的哈希函数为f=(int)x%15,即将一个字符x转换为其ASCII码值(0-255),再将其值除以15,然后将除以15后的余数取整,这就是一个非全映射的哈希函数,结合表1-1,举例来说,字符h和字符w的哈希值都是14,字符t和字符e的哈希值都是11,也就是说,一个哈希值可能会映射到两个不同的字符上。
再结合第三步中被压缩的字符串与字典中的字符串的最长匹配过程,当将thebrown foxy jumping frog进行压缩时,计算该字串的第一个字符的哈希值为11,应该从字典中的以t开头的字串进行匹配才可能会匹配成功,但是,由于t和e的哈希值相同,都是11,则获取到哈希值为11的字符的地址信息为位置23、18、2和0,但位置23,18和2的字符都是e而不是t,这样,需要进行四次匹配,即分别从以位置23、18、2和0的字符为开头的字串进行匹配,找到匹配长度最长的字串。
但是,如果在计算每个字符的哈希值的过程中,用的是全映射函数而不是非全映射函数,则字符t的哈希值是唯一的,当将the brown foxy jumping frog进行压缩时计算出第一个字符t的哈希值,就能找到历史数据中以t为开头的字串,从而进行匹配,提高了压缩速度,但是会增加字典压缩的存储空间。
当然,可以通过优化该非映射哈希函数,尽量使得当前字典中的每两两不同的字串的哈希值都不相同,从而降低哈希冲突。
但如果哈希链表头小于历史数据窗口的大小,通常情况下都会存在哈希冲突,即会存在字典中的至少两个字串通过哈希函数计算出同一哈希值的情况,基于此,在现有技术中,哈希链表头通常设置为历史数据窗口大小。
在本发明实施例中,由于关键字符的个数为n,通信报文中每个字串由m个关键字符组成,则所述第一字串的所有可能的组成形式有n的m次方。
根据上述背景知识,无论是通过全映射函数还是非全映射函数计算所述第一字串的哈希值,所述待压缩的通信报文中所有第一字串在哈希链表头中所占用的存储空间最多为n的m次方。
具体的,若以每个字串做索引,每个字串由3个字符组成,则全部由所述n个关键字符组成的字串的组合有n3种,即使用全映射函数,这些字串所占用的哈希链表头的存储空间也只有n3个字串所占用的存储空间的大小。
当然,m也可以为其他值,本发明实施例对此不做限定。
举例来说,若字典中最多可以存放10000个3字符的字串,其中关键字符的个数为10个,所述第一字串由6000个,则所有所述第一字串的可能的组合有10的3次方种,即1000种,此时,可以设置第一哈希链表头中,该哈希链表头的大小为1000个哈希值以及哈希值所对应的存储空间,此时,所述第一哈希链表头就可以存放6000个字串的哈希值和所述哈希值所对应的存储空间(相同的字串只有一个哈希值和以及该字串的地址信息被存放在所述第一哈希链表头中,其他的被存放在哈希链表中)。
其余的该通信报文中的4000个非第一字串可以被存放在第二哈希链表头中,结合现有技术,所述第二哈希链表头的大小可以设置为4000个哈希值以及哈希值所对应的存储空间大小即可。
则与现有技术哈希链表头的大小为历史数据窗口大小相比,若n的m次方小于H*x,就可以通过上述方法减小哈希链表头的存储空间。
303、若是,分别为第一哈希链表头和第二哈希链表头分配存储空间,其中,所述第一哈希链表头的存储空间大小为n的m次方,所述第二哈希链表头的存储空间为H*(1-x)。
304、判断所述通信报文中的第二字串是否属于所述第一字串。
具体的,步骤303和步骤304的详细技术特征可参见步骤302,本发明实施例对此不再赘述。
305、若是,通过第一哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第一哈希链表头中。
具体的,所述第一哈希函数可以为全映射函数,也可以为非全映射函数,本发明实施例对此不做限定,但是,所述第一哈希函数为全映射函数是一种优选方案,可以实现第一哈希链表头中的哈希冲突为0。
在此之后,根据所述第二字串的哈希值,从所述第一哈希链表头和哈希链表中获取所述第二字串和与所述第二字串的哈希值完全相同的其他字串的地址信息,根据所述地址信息对以所述第一字串开头的字串进行匹配,具体的压缩过程可通过本领域技术人员的公知技术来实现,本发明实施例对此不再赘述。
306、若不是,通过第二哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。
若判断所述第一字串不是全部由所述关键字符组成,则采用现有技术,使用非全映射的第二哈希函数计算所述第一字串的哈希值并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。
在此之后,根据所述第二字串的哈希值,从所述第二哈希链表头和所述哈希链表中获取所述第二字串和与所述第二字串的哈希值完全相同的其他字串的地址信息,根据所述地址信息对以所述第二字串开头的字串进行匹配,具体的压缩过程可通过本领域技术人员的公知技术来实现,本发明实施例对此不再赘述。
本发明实施例提供了一种字典压缩的方法,该方法包括:获取通信报文中第一字串的个数占总字串个数的比值x,其中,所述通信报文中的每个字串都由m个字符组成,所述第一字串是由关键字符组成的字串,所述关键字符的个数为n,字典的大小为H;判断n的m次方是否小于H*x;若是,分别为第一哈希链表头和第二哈希链表头分配存储空间,其中,所述第一哈希链表头的存储空间大小为n的m次方,所述第二哈希链表头的存储空间为H*(1-x);判断所述通信报文中的第二字串是否属于所述第一字串;若是,通过第一哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第一哈希链表头中;若不是,通过第二哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。通过该方法,可得第一哈希链表头与第二哈希链表头的和值为nm+H(1-x),由因为nm<H*x,则nm+H(1-x)<H,即通过本发明方案得到的总的哈希链表头所占用的存储空间小于现有技术中哈希链表头所占用的存储空间,并且,若所述第一哈希函数为全映射函数,可以使得第一哈希链表头中的哈希冲突为0,与现有技术相比,降低了总的哈希冲突。
进一步的,本发明实施例还提供了一种字典压缩的方法,结合图4,该方法包括:
401、按照出现次数由大到小的顺序,获取所述通信报文的L个字符中的前n个字符作为所述关键字符,其中,所述L个字符为所述通信报文中所有两两不同的字符。
402、设置第1至第M个关键字符组,所述每个关键字符组中的字符都属于所述n个字符,所述每个关键字符组中的字符数小于n,所述M大于等于2。
具体的,选择所述n个关键字符后,全部由所述n个关键字符组成的字串占总字串的比例非常大,但是,这n个关键字符中的一部分字符与其他字符的相关性可能不是很大,举例来说,所述n个关键字符分别为a,b,c,e,f,h,全部由这六个关键字符组成的字串占总字串的比重很大,例如,报文由1000个字串组成,每个字串由3个字符组成,全部由所述关键字符组成的字串有700个,但是,所述700个字串中可能有300个是全部由a,b,c,e组成的,剩下的400个是全部由c,e,f,h组成的,在这种情况下,可以设置不止一组关键字符组,举例来说,设置两个个关键字符组,第一个关键字符组由关键字符a,b,c,e组成,第二个关键字符组由c,e,f,h组成,相应的,根据实际情况,第一个关键字符组所对应的全映射函数与第二个关键字符组所对应的全映射函数可以相同,也可以不同,具体的,本发明实施例对此不做限定。
在这种情况下,通常情况下可以进一步的节省第一块哈希链表存储空间中的哈希链表头存储空间,例如,在一共有6个关键字符时,若只设置一个关键字符组,每个字串由三个字符组成,则所有可能的字串有6的3次方个,即216个,若将所述六个关键字符分为所述两个关键字符组,每个关键字符组中有4个关键字符,则所有可能的字串有两组4的3次方个,即128个。
403、获取所述通信报文中第三字串的个数占总字串个数的比值y,其中,所述第三字串是由所述第1至第M个关键字符组中的任一关键字符组中的字符组成的字串,所述通信报文中的每个字串都由m个字符组成,字典的大小为H。
404、获取第1至M个关键字符组中每个关键字符组的关键字符的个数的m次方的和值T。
405、判断所述和值T是否小于H*y。
406、若是,为每个关键字符组分配对应的哈希链表头的存储空间,并为所述第二哈希链表头分配存储空间,其中,所述第N个关键字符组所对应的哈希链表头的存储空间的大小为t的m次方,其中,所述t为所述第N个关键字符组中关键字符的个数,所述第二哈希链表头的存储空间的大小为H*(1-y)。
407、判断所述通信报文中的第二字串是否是由第N个关键字符组中的字符组成的,其中,所述1<=N<=M。
408、若是,通过所述第N个关键字符组所对应的哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入所述第N个关键字符组所对应的哈希链表头中。
409、若不是,通过所述第二哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。
具体的,步骤403-步骤409的详细实施过程可参见上述实施例中的步骤301-步骤306,本发明实施例对此不再赘述。
本发明实施例提供了一种字典压缩的方法,通过本发明方案需要的哈希链表头的存储空间为H*(1-y)+a3+b3+…<H(其中,a、b…都小于n,分别为第1至M个关键字符组中关键字符的个数),从而减小了总的哈希链表头的存储空间,进而减小了字典压缩算法中总的存储空间。
本发明实施例提供了一种字典压缩的装置,结合图5,该装置包括:第一获取单元501,第一判断单元502、分配单元503、第二判断单元504和计算单元505;
所述第一获取单元501,用于获取通信报文中第一字串的个数占总字串个数的比值x,其中,所述通信报文中的每个字串都由m个字符组成,所述第一字串是由关键字符组成的字串,所述关键字符的个数为n,字典的大小为H;
所述第一判断单元502,用于判断n的m次方是否小于H*x;
所述分配单元503,用于分别为第一哈希链表头和第二哈希链表头分配存储空间,其中,所述第一哈希链表头的存储空间大小为n的m次方,所述第二哈希链表头的存储空间为H*(1-x);
所述第二判断单元504,用于判断所述通信报文中的第二字串是否属于所述第一字串;
所述计算单元505,用于若是,通过第一哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第一哈希链表头中;
若不是,通过第二哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。
可选的,结合图6,该装置还包括:第二获取单元506;
所述第二获取单元506,用于按照出现次数由大到小的顺序,获取所述通信报文的L个字符中的前n个字符作为所述关键字符,其中,所述L个字符为所述通信报文中所有两两不同的字符。
可选的,结合图7,该装置还包括:设置单元507;
所述设置单元507,用于设置第1至第M个关键字符组,所述每个关键字符组中的字符都属于所述n个字符,所述每个关键字符组中的字符数小于n,所述M大于等于2;
所述第一获取单元501,还用于获取所述通信报文中第三字串的个数占总字串个数的比值y,其中,所述第三字串是由所述第1至第M个关键字符组中的任一关键字符组中的字符组成的字串,所述通信报文中的每个字串都由m个字符组成,字典的大小为H;
获取第1至M个关键字符组中每个关键字符组的关键字符的个数的m次方的和值T;
所述第一判断单元502,用于判断所述和值T是否小于H*y;
所述分配单元503,用于为每个关键字符组分配对应的哈希链表头的存储空间,并为所述第二哈希链表头分配存储空间,其中,所述第N个关键字符组所对应的哈希链表头的存储空间的大小为t的m次方,其中,所述t为所述第N个关键字符组中关键字符的个数,所述第二哈希链表头的存储空间的大小为H*(1-y);
所述第二判断单元504,用于判断所述通信报文中的第二字串是否是由第N个关键字符组中的字符组成的,其中,所述1<=N<=M;
所述计算单元505,用于若是,通过所述第N个关键字符组所对应的哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入所述第N个关键字符组所对应的哈希链表头中;
若不是,通过所述第二哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。
具体的,所述第N个关键字符组所对应的哈希函数为全映射函数或非全映射函数,所述第二哈希函数为非全映射函数。
本发明实施例提供了一种字典压缩的装置,通过该装置,可得第一哈希链表头与第二哈希链表头的和值为nm+H(1-x),由于nm<H*x,则nm+H(1-x)<H,即通过本发明方案得到的总的哈希链表头所占用的存储空间小于现有技术中哈希链表头所占用的存储空间,并且,若所述第一哈希函数为全映射函数,可以使得第一哈希链表头中的哈希冲突为0,与现有技术相比,降低了总的哈希冲突。
本发明实施例提供了一种计算机***,结合图8,该计算机***包括:处理器801,总线802和与所述总线相连的存储器803;
所述处理器801通过所述总线802调用所述存储器803中的指令,以用于:
获取通信报文中第一字串的个数占总字串个数的比值x,其中,所述通信报文中的每个字串都由m个字符组成,所述第一字串是由关键字符组成的字串,所述关键字符的个数为n,字典的大小为H;
判断n的m次方是否小于H*x;
若是,分别为第一哈希链表头和第二哈希链表头分配存储空间,其中,所述第一哈希链表头的存储空间大小为n的m次方,所述第二哈希链表头的存储空间为H*(1-x);
判断所述通信报文中的第二字串是否属于所述第一字串;
若是,通过第一哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第一哈希链表头中;
若不是,通过第二哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。
可选的,所述处理器801还用于:
按照出现次数由大到小的顺序,获取所述通信报文的L个字符中的前n个字符作为所述关键字符,其中,所述L个字符为所述通信报文中所有两两不同的字符。
具体的,所述处理器801还用于:
设置第1至第M个关键字符组,所述每个关键字符组中的字符都属于所述n个字符,所述每个关键字符组中的字符数小于n,所述M大于等于2;
获取所述通信报文中第三字串的个数占总字串个数的比值y,其中,所述第三字串是由所述第1至第M个关键字符组中的任一关键字符组中的字符组成的字串,所述通信报文中的每个字串都由m个字符组成,字典的大小为H;
获取第1至M个关键字符组中每个关键字符组的关键字符的个数的m次方的和值T;
判断所述和值T是否小于H*y;
若是,为每个关键字符组分配对应的哈希链表头的存储空间,并为所述第二哈希链表头分配存储空间,其中,所述第N个关键字符组所对应的哈希链表头的存储空间的大小为t的m次方,其中,所述t为所述第N个关键字符组中关键字符的个数,所述第二哈希链表头的存储空间的大小为H*(1-y);
判断所述通信报文中的第二字串是否是由第N个关键字符组中的字符组成的,其中,所述1<=N<=M;
若是,通过所述第N个关键字符组所对应的哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入所述第N个关键字符组所对应的哈希链表头中;
若不是,通过所述第二哈希函数计算所述第二字串的哈希值,并将所述第二字串的哈希值以及所述第二字串在字典中的地址信息存入第二哈希链表头中。
具体的,所述第N个关键字符组所对应的哈希函数为全映射函数或非全映射函数,所述第二哈希函数为非全映射函数。
本发明实施例提供了一种计算机***,通过该计算机***,可得第一哈希链表头与第二哈希链表头的和值为nm+H(1-x),由因为nm<H*x,则nm+H(1-x)<H,即通过本发明方案得到的总的哈希链表头所占用的存储空间小于现有技术中哈希链表头所占用的存储空间,并且,若所述第一哈希函数为全映射函数,可以使得第一哈希链表头中的哈希冲突为0,与现有技术相比,降低了总的哈希冲突。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。