发明内容
本发明实施例提供一种创建哈希表的方法和设备,能够生成非2的正整数次幂空间的哈希表,减少空间浪费,降低了实现的代价。
第一方面,提供了一种创建哈希表的方法,包括:根据哈希表的N个哈希子表中第n个哈希子表的空间确定至少两个哈希子表子空间,其中,第n个哈希子表的空间的大小为非2的正整数次幂,至少两个哈希子表子空间的大小为2的正整数次幂,其中,N为大于或等于2的整数,n=1,2,…,N;根据第n个预处理哈希函数将当前键值映射到至少两个哈希子表子空间之一,第n个预处理哈希函数用于将多个键值映射到至少两个哈希子表子空间中;根据至少两个哈希子表子空间之一对应的哈希函数和当前键值生成第n个哈希子表的哈希桶地址;根据针对N个哈希子表生成的N个哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在N个哈希子表中的一个哈希子表中。
结合第一方面,在第一种可能的实现方式中,至少两个哈希子表子空间包括M个哈希子表子空间,至少两个哈希子表子空间之一为第m个哈希子表子空间,其中,M为大于或等于2的整数,m为1,2,…,M中的数,根据至少两个哈希子表子空间之一对应的哈希函数和当前键值生成第n个哈希子表的哈希桶地址,包括:根据第m个哈希子表子空间对应的哈希函数和当前键值生成当前键值对应于第m个哈希子表子空间的哈希桶地址;计算第1个哈希子表子空间至第m-1个哈希子表子空间的大小之和;将当前键值对应于第m个哈希子表子空间的哈希桶地址与第1个哈希子表子空间至第m-1个哈希子表子空间的大小之和相加,得到第n个哈希子表的哈希桶地址。
结合第一方面或第一种可能的实现方式,在第二种可能的实现方式中,第n个预处理哈希函数为循环冗余校验(Cyclic Redundancy Check,CRC)函数,根据第n个预处理哈希函数将当前键值映射到至少两个哈希子表子空间之一,包括:根据第n个预处理哈希函数和当前键值得到预处理结果;将预处理结果对至少两个哈希子表子空间中的各空间的比例之和做取模运算;根据取模运算的结果将当前键值映射到至少两个哈希子表子空间之一。
结合第一方面或第一种和第二种可能的实现方式中的任一种可能的实现方式,在第三种可能的实现方式中,根据针对N个哈希子表生成的N个哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在N个哈希子表中的一个哈希子表中,包括:确定N个哈希子表生成的N个哈希子表的哈希桶地址中的空闲分片数目最多的哈希桶地址和空闲分片数目最多的哈希桶地址对应的第p个哈希子表;获取当前键值对应于第p个哈希子表的指纹值;将当前键值存储在哈希子表的原始键值表中;将当前键值对应于第p个哈希子表的指纹值和当前键值的索引信息存储在空闲分片数目最多的哈希桶地址对应的空闲分片上,其中,索引信息指示当前键值存储在原始键值表中的地址,p为1,2,…,N中的数。
结合第三种可能的实现方式,在第四种可能的实现方式中,获取当前键值对应于第p个哈希子表的指纹值;包括:根据第n个预处理哈希函数和至少两个哈希子表子空间之一对应的哈希函数生成当前键值的第n个指纹值;将第n个指纹值作为当前键值对应第p个哈希子表的指纹值,其中n不等于p。
结合第三种可能的实现方式,在第五种可能的实现方式中,获取当前键值对应于第p个哈希子表的指纹值;包括:确定第n个指纹值生成函数;根据第n个指纹值生成函数和至少两个哈希子表子空间之一对应的哈希函数生成当前键值的第n个指纹值;将第n个指纹值作为当前键值对应于第p个哈希子表的指纹值,其中n不等于p。
结合第一方面或第一和第二种可能的实现方式中的任一种可能的实现方式,在第六种可能的实现方式中,根据针对N个哈希子表生成的N个哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在N个哈希子表中的一个哈希子表中,包括:确定N个哈希子表生成的N个哈希子表的哈希桶地址中的空闲分片数目最多的哈希桶地址和空闲分片数目最多的哈希桶地址对应的第p个哈希子表;将当前键值存储在空闲分片数目最多的哈希桶地址对应的空闲分片上,p为1,2,…,N中的数。
结合第一方面或第一至第六种可能的实现方式中的任一种可能的实现方式,在第七种可能的实现方式中,N=2,哈希子表为2-left哈希子表。
第二方面,提供了一种创建哈希表的设备,包括确定单元,用于根据哈希表的N个哈希子表中第n个哈希子表的空间确定至少两个哈希子表子空间,其中,第n个哈希子表的空间的大小为非2的正整数次幂,至少两个哈希子表子空间的大小为2的正整数次幂,其中,N为大于或等于2的整数,n=1,2,…,N;映射单元,用于根据第n个预处理哈希函数将当前键值映射到至少两个哈希子表子空间之一,第n个预处理哈希函数用于将多个键值映射到至少两个哈希子表子空间中;生成单元,用于根据至少两个哈希子表子空间之一对应的哈希函数和当前键值生成哈希子表的哈希桶地址;存储单元,用于根据针对N个哈希子表生成的N个哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在N个哈希子表中的一个哈希子表中。
结合第二方面,在第一种可能的实现方式中,至少两个哈希子表子空间包括M个哈希子表子空间,至少两个哈希子表子空间之一为第m个哈希子表子空间,其中,M为大于或等于2的整数,m为1,2,…,M中的数,生成单元根据第m个哈希子表子空间对应的哈希函数和当前键值生成当前键值对应于第m个哈希子表子空间的哈希桶地址,计算第1个哈希子表子空间至第m-1个哈希子表子空间的大小之和,并将当前键值对应于第m个哈希子表子空间的哈希桶地址与第1个哈希子表子空间至第m-1个哈希子表子空间的大小之和相加,得到哈希子表的哈希桶地址。
结合第二方面或第二方面的第一种可能的实现方式,在第二种可能的实现方式中,第n个预处理哈希函数为CRC函数,映射单元根据第n个预处理哈希函数和当前键值得到预处理结果,将预处理结果对至少两个哈希子表子空间中的各空间的比例之和做取模运算,并根据取模运算的结果将当前键值映射到至少两个哈希子表子空间之一。
结合第二方面或第二方面的第一和第二种可能的实现方式中的任一种可能的实现方式,在第三种可能的实现方式中,存储单元确定N个哈希子表生成的N个哈希子表的哈希桶地址中的空闲分片数目最多的哈希桶地址和空闲分片数目最多的哈希桶地址对应的第p个哈希子表,获取当前键值对应于第p个哈希子表的指纹值,将当前键值存储在哈希子表的原始键值表中,并将当前键值对应于第p个哈希子表的指纹值和当前键值的索引信息存储在空闲分片数目最多的哈希桶地址对应的空闲分片上,其中,索引信息指示当前键值存储在原始键值表中的地址,p为1,2,…,N中的数。
结合第二方面的第三种可能的实现方式,在第四种可能的实现方式中,存储单元根据第n个预处理哈希函数和至少两个哈希子表子空间之一对应的哈希函数生成当前键值的第n个指纹值,并将第n个指纹值作为当前键值对应第p个哈希子表的指纹值,其中n不等于p。
结合第二方面的第三种可能的实现方式,在第五种可能的实现方式中,存储单元确定第n个指纹值生成函数,根据第n个指纹值生成函数和至少两个哈希子表子空间之一对应的哈希函数生成当前键值的第n个指纹值,并将第n个指纹值作为当前键值对应于第p个哈希子表的指纹值,其中n不等于p。
结合第二方面或第二方面的第一和第二种可能的实现方式中的任一种可能的实现方式,在第六种可能的实现方式中,存储单元确定N个哈希子表生成的N个哈希子表的哈希桶地址中的空闲分片数目最多的哈希桶地址和空闲分片数目最多的哈希桶地址对应的第p个哈希子表,并将当前键值存储在空闲分片数目最多的哈希桶地址对应的空闲分片上,p为1,2,…,N中的数。
结合第二方面或第二方面的第一至第六种可能的实现方式中的任一种可能的实现方式,在第七种可能的实现方式中,N=2,哈希表为2-left哈希表。
基于上述技术方案,通过根据哈希表的N个非2的正整数次幂空间的哈希子表中的每个哈希子表的空间确定至少两个2的正整数次幂的哈希子表子空间,进而对当前键值做分析,根据针对该N个哈希子表生成的哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在N个哈希子表中的一个哈希子表中,能够生成非2的正整数次幂空间的哈希子表,使得该N个哈希子表构成的非2的正整数次幂空间的哈希表可以更好的匹配表项的需求,减少空间浪费,降低了实现的代价。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都应属于本发明保护的范围。
图1是为本发明一个实施例的创建哈希表的方法流程示意图。
在描述本发明实施例的方法之前,先对本发明实施例中哈希表的结构进行说明。本发明实施例中的哈希表包括:N个哈希子表和一个原始键值表。N个哈希子表分别为第1个哈希子表、第2个哈希子表,...第N个哈希子表,用于存放键值对应的指纹值和索引,指纹值包括键值分别经过至少两个哈希函数后的输出结果,其长度低于键值的长度,可以提高查找性能和空间利用率;该索引可以指示键值在原始键值表中的地址;或者该索引为键值在原始键值表中的地址,能够指示键值在原始键值表中的位置。该原始键值表,用于存放键值。例如,当N=2时,本发明实施例的哈希表为2-left哈希表。
应注意,本发明实施例中的N个哈希子表还可以用于存放键值,在此种情况下,本发明实施例中的哈希表包括:N个哈希子表,分别为第1个哈希子表、第2个哈希子表,...第N个哈希子表,即可以不包括原始键值表。
下面结合上述哈希表的结构描述图1的方法,该方法包括如下内容。
110,根据哈希表的N个哈希子表中第n个哈希子表的空间确定至少两个哈希子表子空间,其中,第n个哈希子表的空间的大小为非2的正整数次幂,至少两个哈希子表子空间的大小为2的正整数次幂,其中,N为大于或等于2的整数,n=1,2,…,N。
换句话说,将N个哈希子表中的每个哈希子表的空间分成至少两个哈希子表子空间。具体地,根据需求获取哈希表空间,哈希表空间为非2的正整数次幂空间;将哈希表的空间分为第1个哈希子表的空间、第2个哈希子表的空间、…第N个哈希子表的空间,其中第n个哈希子表的空间大小也为非2的正整数次幂,且为该哈希表空间的1/N。换句话说,N个哈希子表中的每个哈希子表的空间的大小可以为非2的正整数次幂,并且每个哈希子表的空间的大小可以相同,均为该哈希表空间的1/N。
应理解,N个哈希子表中的不同的两个哈希子表空间分成的至少两个哈希子表子空间的个数可以相同,例如,每个哈希子表的空间均被成为3个哈希子表空间,本发明的实施例并不限于此,N个哈希子表中的不同的两个哈希子表空间分成的至少两个哈希子表子空间的个数也可以不同,例如,一个哈希子表的空间被分为3个哈希子表空间、另一个哈希子表的空间被分为4个哈希子表空间。
应注意,本发明实施例中,可以将非2的正整数次幂空间刚好划分为多个2的正整数次幂空间,在实际应用中,考虑实际需求、划分的2的正整数次幂空间的个数及实现代价的问题,划分的多个2的正整数次幂空间之和可能会略大于该非2的正整数次幂,例如,以非2的正整数次幂空间24 000 000为例,可以将其分解成16兆和8兆空间的组合。这里16兆和8兆之和24兆(25165842)会略大于24 000 000。
120,根据第n个预处理哈希函数将当前键值映射到至少两个哈希子表子空间之一,第n个预处理哈希函数用于将多个键值映射到至少两个哈希子表子空间中。
具体地,第n个哈希子表对应于第n个预处理哈希函数,对于第n个哈希子表,该第n个哈希函数能够将当前键值映射到第n个哈希子表的至少两个哈希子表子空间中的一个空间。换句话说,可以为每个哈希子表设置相应的预处理哈希函数,例如,可以为N个哈希子表设置相同的预处理哈希函数,也可以分别为不同的哈希子表设置不同的预处理哈希函数。
130,根据上述至少两个哈希子表子空间之一对应的哈希函数和当前键值生成第n个哈希子表的哈希桶地址。
具体地,根据当前键值映射到第n个哈希子表的至少两个哈希子表子空间中的一个空间对应的哈希函数和该当前键值,生成当前键值在第n个哈希子表的哈希桶地址。
也就是说,首先经过预处理哈希函数的分流,选择当前键值映射到某个子空间进行哈希函数计算,然后根据该子空间的哈希函数计算的结果确定第n个哈希子表的哈希桶地址。
应注意,不同的哈希子表子空间对应的哈希函数可以为不同的哈希函数。
140,根据针对N个哈希子表生成的N个哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在N个哈希子表中的一个哈希子表中。
具体地,可以将当前键值的指纹值和索引信息存储在N个哈希子表之一,并将当前键值存储在原始键值表中。可替代地,可以将当前键值的存储在N个哈希子表中的一个哈希子表中。
因此,本发明实施例通过根据哈希表的N个非2的正整数次幂空间的哈希子表中的每个哈希子表的空间确定至少两个2的正整数次幂的哈希子表子空间,进而对当前键值做分析,根据针对该N个哈希子表生成的哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在N个哈希子表中的一个哈希子表中,能够生成非2的正整数次幂空间的哈希子表,使得该N个哈希子表构成的非2的正整数次幂空间的哈希表可以更好的匹配表项的需求,减少空间浪费,降低了实现的代价。
应理解,应用在通信领域中,本发明实施例中的创建哈希表的方法的执行主体可以为路由器或交换机等网络设备,该当前键值是指该网络设备当前正在处理的键值,该键值可以为接收到数据报文的介质访问控制(Media Access Control,MAC)地址或包含源互联网协议(Internet Protocol,IP)地址、源端口、目的IP地址、目的端口和传输层协议号的五元组信息,应注意,五元组中的前后顺序可以为任意,本发明实施例并不对此做限定。
应理解,在初始时,第n个哈希子表中的分片都是空闲的,也就是说,在初始时第n个哈希子表为空表,相应的,当哈希子表包括原始键值表时,在初始时,原始键值表也为空表,即初始时原始键值表中没有存储原始键值。
根据本发明实施例,至少两个哈希子表子空间包括M个哈希子表子空间。在120中,至少两个哈希子表子空间之一为第m个哈希子表子空间,其中,M为大于或等于2的整数,m为1,2,…,M中的数。在130中,可以根据第m个哈希子表子空间对应的哈希函数和当前键值生成当前键值对应于第m个哈希子表子空间的哈希桶地址;计算第1个哈希子表子空间至第m-1个哈希子表子空间的大小之和;将当前键值对应于第m个哈希子表子空间的哈希桶地址与第1个哈希子表子空间至第m-1个哈希子表子空间的大小之和相加,得到第n个哈希子表的哈希桶地址。
换句话说,第n个哈希子表的空间分为M个哈希子表子空间,当前键值经过第n个预处理哈希函数映射到M个哈希子表子空间中的第m个哈希子表子空间。根据第m个哈希子表子空间对应的哈希函数生成当前键值对应于第m个哈希子表子空间的哈希桶地址;当前键值在第n个哈希子表中的哈希桶地址即为第m个哈希子表子空间的哈希桶地址与第1到第m-1哈希子表子空间大小之和相加。例如当前键值映射到第3个哈希子表子空间,在第3个哈希子表子空间的哈希桶地址为c,如果第1个哈希子表子空间的大小为a,第2个哈希子表子空间大小为b,那么当前键值的第n个哈希子表的哈希桶地址为a+b+c。这样,整体输出哈希子表的空间地址连续分布,并且在上述非2的正整数次幂范围内。
可选地,作为另一实施例,第n个预处理哈希函数可以为CRC函数、平方取中函数或折叠相加函数,在120中,可以根据第n个预处理哈希函数和当前键值得到预处理结果;将预处理结果对至少两个哈希子表子空间中的各空间的比例之和做取模运算;根据取模运算的结果将当前键值映射到至少两个哈希子表子空间之一。
例如,预处理函数可以为CRC16函数,对当前键值做CRC16运算,可以根据哈希子表子空间的比例,对CRC16结果按照两者比例的和做取模运算,根据余数决定映射到哪个子空间。比如至少两个哈希子表子空间为2个时,且第1哈希子表子空间大小为16兆,第2哈希子表子空间大小为8兆,则两者比例为2:1,则可以对当前键值做CRC16后的结果对3(2加1,至少两个哈希子表子空间中的各空间的比例之和)做取模运算,如果取模后结果是1则映射到8兆空间,否则映射到16兆空间。
应注意,预处理哈希函数可以为具有分流作用的离散性比较好的函数,预处理哈希函数也可以为CRC函数、平方取中函数或折叠相加函数,本发明实施例并不对此做限定。
根据本发明实施例,本发明实施例中的哈希表可以包括原始键值表,此时哈希子表中存储键值的指纹值和索引信息,原始键值表用于存储键值。
根据本发明实施例,本发明实施例中的哈希表可以包括N个哈希子表,分别为第1个哈希子表、第2个哈希子表,...第N个哈希子表,用于存放键值对应的指纹值和索引,该索引可以指示键值在原始键值表中的地址;或者该索引为键值在原始键值表中的地址,能够指示键值在原始键值表中的位置;一个原始键值表,用于存放键值。
具体地,作为另一实施例,在140中,可以确定N个哈希子表生成的N个哈希子表的哈希桶地址中的空闲分片数目最多的哈希桶地址和空闲分片数目最多的哈希桶地址对应的第p个哈希子表;获取当前键值对应于第p个哈希子表的指纹值;将当前键值存储在哈希子表的原始键值表中;将当前键值对应于第p个哈希子表的指纹值和当前键值的索引信息存储在空闲分片数目最多的哈希桶地址对应的空闲分片上,其中,索引信息指示当前键值存储在原始键值表中的地址,p为1,2,…,N中的数。
进一步地,作为另一实施例,获取当前键值对应于第p个哈希子表的指纹值;包括:根据第n个预处理哈希函数和至少两个哈希子表子空间之一对应的哈希函数生成当前键值的第n个指纹值;将第n个指纹值作为当前键值对应第p个哈希子表的指纹值,其中n不等于p。
换句话说,在哈希表的构建中,通常需要重新确定哈希函数来作为指纹值的一部分,本发明实施例可以直接利用预处理哈希函数的输出结果作为指纹值的一部分,而不需要重新确定函数,例如预处理函数可以为CRC16函数,计算后的CRC16结果可以用作指纹值的一部分,从而节省指纹值产生函数降低了实现的代价。此种情况下的指纹值包括如下两部分:当前键值经过第n个预处理哈希函数的输出结果和当前键值经过至少两个哈希子表子空间之一对应的哈希函数的输出结果。
可替代地,作为另一实施例,获取当前键值对应于第p个哈希子表的指纹值;包括:确定第n个指纹值生成函数,该第n个指纹值生成函数可以对应于第n个哈希子表空间的哈希函数;根据第n个指纹值生成函数和至少两个哈希子表子空间之一对应的哈希函数生成当前键值的第n个指纹值;将第n个指纹值作为当前键值对应于第p个哈希子表的指纹值,其中n不等于p。此种情况下的指纹值包括如下两部分:当前键值经过第n个指纹值生成函数的输出结果和当前键值经过至少两个哈希子表子空间之一对应的哈希函数的输出结果。
上文中的指纹值仅包括两部分组成,应理解,指纹值可以包括三部分或者更多部分,例如指纹值可以包括三部分组成,具体地指纹值还可以包括当前键值经过第n'个指纹值生成函数的输出结果。该第n'个指纹值生成函数可以对应于第n个哈希子表空间的哈希函数
换句话说,本发明实施例中也可以不使用预处理哈希函数的输出结果作为指纹值的一部分,而是重新确定指纹值生成函数,该方案同样可以实现生成非2的正整数次幂空间的哈希表,减少空间浪费。
应注意,指纹两个部分、三个部分或多个部分的顺序可以任意,较佳地,所有指纹的至少两个部分的顺序应当保持一致。
根据本发明实施例,本发明实施例中的哈希子表中的N个哈希子表还可以用于存放键值,在此种情况下,本发明实施例中的哈希子表包括:N个哈希子表,分别为第1个哈希子表、第2个哈希子表,...第N个哈希子表,不包括原始键值表。
具体地,作为另一实施例,在140中,可以确定N个哈希子表生成的N个哈希子表的哈希桶地址中的空闲分片数目最多的哈希桶地址和空闲分片数目最多的哈希桶地址对应的第p个哈希子表;将当前键值存储在空闲分片数目最多的哈希桶地址对应的空闲分片上,p为1,2,…,N中的数。
应理解,哈希子表的表项个数即为哈希子表的地址空间的个数,一个地址空间可以称为一个桶,一个桶中包括多个分片,也就是说哈希子表的表项个数即为桶的个数。
换句话说,一个桶可以看作一行,哈希子表的表项个数即为哈希子表的行数,桶中的多个分片可以看作多个列,例如,哈希子表的表项个数为非2的正整数次幂,也就是说哈希子表的空间为非2的正整数次幂,换句话说,哈希子表具有非2的正整数次幂行,每一行具有多个列,一个桶的多个分片用于存储具有相同哈希桶地址的键值在原始键值表中的索引和它们的指纹值。当不同的两个键值的哈希桶地址相同时,表示这两个键值存在冲突,一个桶中分片的个数为空间深度,可以理解为支持冲突的个数。
应注意,本发明实施例中的一个桶可以有多个分片,例如,可以有2个、3个、4个或5个分片。本发明实施例并不对此做限定,需要说明的是,当一个桶的分片个数确定后,所有桶的分片个数都确定,并且所有桶的分片的个数是相同的。
在本发明实施例中的哈希表包括:N个哈希子表和一个原始键值表时,其中,N个哈希子表,分别为第1个哈希子表、第2个哈希子表,...第N个哈希子表,用于存放键值对应的指纹值和索引,该索引是键值在原始键值表中的地址;一个原始键值表,用于存放键值。对于一个键值,先计算该键值在N个哈希子表中对应的哈希桶地址,如果N个哈希子表的哈希桶地址的多个分片都是空闲的,也就是没有指纹值和索引信息,则在其中一个哈希子表的哈希桶地址上的第一个分片上记录该键值对应的指纹值,同时将此键值添加到原始键值表中,并将此键值在原始键值表中的地址即索引信息记录在第一个分片上。
如果N个哈希子表的哈希桶地址的多个分片上存在指纹值和索引信息,则将此键值的指纹值信息与该哈希桶地址的分片上的指纹值信息做比较,如果有其中一个桶中的指纹值与该指纹值相同,则将该键值与存储此指纹值的分片上的索引信息对应的原始键值表中的键值做比较,如果两者相同,则说明此键值已经创建在哈希子表中。
如果该键值的指纹值与桶中的指纹值不相同,则将此键值的指纹值存储在空闲分片数量多的桶中,同时将此键值添加到原始键值表中,并将此键值在原始键值表中的地址即索引信息记录在该桶中对应的分片上;如果存在多个桶的空闲分片数量相等,则选择其中一个桶,同时将此键值添加到中,并将此键值在原始键值表中的地址即索引信息记录在该桶中对应的空闲分片上;这样可以使键值在哈希表中分布更加均匀,冲突概率更低,而且也可以降低对每个哈希函数性能的要求。
应注意,在其中一个桶中的指纹值与该指纹值相同的情况下,如果该键值与存储此指纹值的分片上的索引信息找到在原始键值表中的键不相同,则不做处理,需要说明的一点是,这种情况为小概率事件,出现此种情况的可能性很小,本发明实施例可以不考虑此种情况的发生。当本发明的实施例应用在网络设备中时,如果出现此种情况,可以将此报文信息广播出去。
应理解,本发明实施例中,指纹值的长度远低于键值的长度,可以提高查找性能和空间利用率。原始键值表中存储与指纹值对应的键值,哈希表的每一个分片上存储一个键值对应的指纹值和一个索引,该索引是键值在原始键值表中的地址。
应注意,本发明实施例中对于超出空间深度的键值的指纹值和索引,本发明实施例中的哈希表还可以包括冲突处理空间,用于存储超出空间深度的键值的指纹值和索引。
在本发明实施例中的哈希表包括:N个哈希子表,分别为第1个哈希子表、第2个哈希子表,...第N个哈希子表,不包括原始键值表时。对于一个键值,先计算该键值在N个哈希子表中对应的哈希桶地址,如果N个哈希子表的哈希桶地址的多个分片都是空闲的,则在其中一个哈希子表的哈希桶地址上的第一个分片上存储该键值。
如果N个哈希子表的哈希桶地址的多个分片上存在键值,将当前键值与哈希桶地址的多个分片上存在键值做比较,如果相同,则说明此键值已经创建在哈希子表中。
如果该键值与桶中的键值不相同,则将此键值存储在空闲分片数量多的桶中。如果存在多个桶的空闲分片数量相等,则选择其中一个桶存储该键值。
应注意,图1的例子仅仅是为了帮助本领域技术人员理解本发明实施例,而非要将本发明实施例限于所例示的具体数值或具体场景。本领域技术人员根据所给出的图1的例子,显然可以进行各种等价的修改或变化,这样的修改或变化也落入本发明实施例的范围内。
下面结合图2和图3,更加详细地描述本发明实施例。
图2是为本发明另一实施例的创建哈希表的方法流程示意图。图3是为本发明实施例的哈希表的示意图。图3对应图2实施例中的哈希表,图2为图1中N=2的例子,也就是图2中的哈希表为2-left哈希表的例子。如图3所示的哈希表包括,第一个哈希子表table1、第二个哈希子表table2和原始键值表。应注意,图3中第一个哈希子表和第二个哈希子表分别仅示意出了一个桶,该桶上包括3个分片的情形,图3仅是示意性的,哈希子表中其他桶未在图中标出,每一个桶上分片的数量还可以为4个或5个等,本发明实施例并不限于此。下面结合图3对图2的实施例进行说明,图2的方法包括如下内容。
201,子空间分解:将第一个哈希子表空间和第二个哈希子表空间分别分成至少两个哈希子表子空间。
应理解,第一个哈希子表空间和第二个哈希子表空间为等大的非2的正整数次幂,该第一个哈希子表空间和第二个哈希子表的空间大小根据实际需求获得,该至少两个哈希子表子空间的大小为2的正整数次幂。
具体地,将第一个哈希子表空间分成至少两个2的正整数次幂空间,将第二个哈希子表空间分成至少两个2的正整数次幂空间,由于2的正整数次幂的哈希函数比较容易找到,而且实现代价比较低,便于选择哈希函数。例如,可以将第一个哈希子表空间和第二个哈希子表空间分成2个、3个、4个、6个、9个、等哈希子表子空间,本发明实施例并不对此做限定。应注意,第一个哈希子表空间和第二个哈希子表空间拆分的2的正整数次幂的子空间的个数可以相同也可以不同,如果第一个哈希子表空间和第二个哈希子表空间拆分的2的正整数次幂的子空间的个数相同,拆分的2的正整数次幂的子空间的大小可以相同也可以不同,本发明并不对此做限定,优选地,第一个哈希子表空间和第二个哈希子表空间拆分的2的正整数次幂的子空间的个数和大小都相同。
例如,第一个哈希子表为table1,第二个哈希子表为table2,将第一个哈希子表空间分成两个2的正整数次幂子空间,例如为m1和n1,将第二个哈希子表空间分成两个2的正整数次幂子空间,例如为m2和n2。
具体而言,以第一个哈希子表空间和第二个哈希子表空间为非2的正整数次幂空间24 000 000为例,可以分别将其分解成m1=16兆和n1=8兆空间的组合,m2=16兆和n2=8兆的空间的组合,每个空间分别对应自己的哈希函数,2的正整数次幂的哈希函数比较容易找到,而且实现代价是比较低的。
应注意,本发明实施例中,可以将非2的正整数次幂空间刚好划分为多个2的正整数次幂空间,在实际应用中,考虑实际需求、划分的2的正整数次幂空间的个数及实现代价的问题,划分的多个2的正整数次幂空间之和可能会略大于该非2的正整数次幂,例如,以非2的正整数次幂空间24 000 000为例,可以将其分解成16兆和8兆空间的组合。这里16兆和8兆之和24兆(25165842)会略大于24 000 000。
202,哈希函数选取:对于分解的2的正整数次幂子空间,选择其对应的哈希函数。
具体地,对于步骤201中第一个哈希子表空间和第二个哈希子表空间各自分解的至少两个2的正整数次幂子空间分别选择哈希函数。例如,如图3所示,对于第一个哈希子表分解的2的正整数次幂子空间m1和n1分别选择哈希函数hash1-m1和hash1-n1,对于第二个哈希子表分解的2的正整数次幂子空间m2和n2分别选择哈希函数hash2-m2和hash2-n2,具体而言,对于第一个哈希子表分解的m1=16兆的子空间和n1=8兆子空间选择哈希函数hash1-m1和hash1-n1,对于第二个哈希子表分解的m2=16兆的子空间和n2=8兆的子空间选择哈希函数hash2-m2和hash2-n2,其中,哈希函数hash1-m1和哈希函数hash2-m2是2的正整数次幂16兆,哈希函数hash1-n1和哈希函数hash2-n2是2的正整数次幂8兆。
应注意,本发明实施例中虽然哈希子表子空间m1和m2相同且都为16兆,优选方案哈希函数hash1-m1和hash2-m2为不同的两个哈希函数,同样的,虽然哈希子表空间n1和n2相同且都为8兆,优选方案哈希函数hash1-n1和哈希函数hash2-n2为不同的两个哈希函数。
应理解,哈希子表空间对应的哈希函数是2的正整数次幂是指函数的最大输出值为对应一个2的正整数次幂的值,因此,生成的哈希子表空间也是2的正整数次幂,比如2兆、8兆、32兆等等。例如,哈希函数是2的正整数次幂16兆指函数的最大输出值为16兆,相应地,哈希函数是2的正整数次幂16兆则该哈希函数生成的哈希子表空间也是2的正整数次幂16兆,再例如,哈希函数是2的正整数次幂8兆指函数的最大输出值为8兆,相应地,哈希函数是2的正整数次幂8兆则该哈希函数生成的哈希子表空间也是2的正整数次幂8兆。
203,确定预处理哈希函数:确定第一个哈希子表的第一预处理函数,确定第二个哈希子表的第二个预处理函数。
具体地,根据第一个哈希子表空间和第二个哈希子表空间分成的至少2的正整数次幂子空间的结果;确定第1预处理哈希函数和第2预处理哈希函数,例如,如图3所示,第1预处理哈希函数为hash-pre1,第2预处理哈希函数为hash-pre2,第1预处理哈希函数hash-pre1对应第一个哈希子表,第二预处理哈希函数hash-pre2对应第二个哈希子表,这两个哈希函数均具有如下两个作用:1)用于将当前键值向分解的子空间映射;2)用于构成哈希子表中的指纹值。换句话说,hash-pre1和hash-pre2具有分流的作用,函数计算结果用于分解的子空间分配,从而将当前键值分配到子空间中进行哈希运算。具体地,能够将当前键值分配到哪一个2的正整数次幂子空间哈希函数运算,并映射到该2的正整数次幂子空间内,例如,对于当前键值经过hash-pre1和hash-pre2运算后,能够决定该当前键值经过哪一个2的正整数次幂函数做映射,当前键值经过hash-pre1运算后,能够决定当前键值是通过哈希函数hash1-m1还是通过哈希函数hash1-n1做映射;当前键值经过hash-pre2运算后,能够决定当前键值是通过哈希函数hash1-m2还是通过哈希函数hash1-n2做映射。
另外,预处理哈希函数的计算结果可以作为当前键值的指纹值一部分。具体而言,如果当前键值映射到第一个哈希子表中,则该当前键值经过hash-pre2运算后的结果作为该当前键值的指纹值的一部分存储在第一个哈希子表中的对应地址;如果当前键值映射到第二个哈希子表中,则该当前键值经过hash-pre1运算后的结果作为该当前键值的指纹值的一部分存储在第二个哈希子表中的对应地址。
应注意,本发明实施例中的指纹值还包括分解的2的正整数次幂子空间对应的哈希函数运算的结果,例如,当前键值经过值哈希函数hash1-m1映射到第一个哈希子表中,则该当前键值的指纹值包括该当前键值经过值哈希函数hash1-m1运算的结果和经过hash-pre2运算后的结果;再例如,当前键经过值哈希函数hash2-n2映射到第二个哈希子表中,则该当前键值的指纹值包括该当前键值经过值哈希函数hash2-n2运算的结果和经过hash-pre1运算后的结果。
应注意,预处理哈希函数为具有分流作用的离散性比较好的函数,可以为CRC函数、平方取中函数或折叠相加函数,本发明实施例并不对此做限定。
204,预处理哈希函数计算:对当前键值分别通过第一预处理哈希函数和第二预处理哈希函数做运算。
具体地,将当前键值按照选取好的预处理函数进行计算,计算的结果一方面用于子空间映射使用,将当前键值映射到对应的哈希子表子空间;另一方面用于哈希子表的指纹值,从而节约指纹值产生函数fun1和fun2。
例如,预处理函数可以为常见的CRC函数。比如,hash-pre1函数可以为CRC16函数,对当前键值做CRC16运算,可以根据子空间的比例,对CRC16结果按照两者比例的和做取模运算,根据余数决定映射到哪个子空间。比如两个子空间分别位16兆和8兆,则两者比例为2:1,则可以对当前键值做CRC16后的结果和3做取模运算,如果结果是1则映射到8兆空间,否则映射到16兆空间。比如,当前键经过预处理计算后,经过哈希函数hash1-m1映射到第一个哈希子表的16兆空间中,hash-pre2函数可以为另一CRC16函数,则该当前键值的指纹值包括该当前键值经过值哈希函数hash1-m1运算的结果和经过hash-pre2另一CRC16函数运算后的结果。
在现有哈希子表的构建中,需要重新确定哈希函数fun1和fun2来作为指纹值的一部分,本发明实施例直接利用预处理哈希函数hash-pre1和hash-pre2的输出结果作为指纹值的一部分,而不需要重新确定函数,例如计算后的CRC16结果可以用作指纹值,从而节省指纹值产生函数fun1和fun2,降低了实现的代价。
可替代地,本发明实施例中也可以不使用哈希函数hash-pre1和hash-pre2的输出结果作为指纹值的一部分,而是重新确定第一个指纹值生成函数和第二个指纹值生成函数,例如为哈希函数fun1和fun2,该方案同样可以实现生成非2的正整数次幂空间的哈希子表,减少空间浪费。
205,分解子空间哈希计算:将当前键值按照映射子空间的哈希函数进行计算,得到对应映射子空间的哈希结果。
也就是说经过预处理哈希函数的分流,选择当前键值通过哪一个子空间哈希函数计算,经过子空间哈希运算的结果用于确定哈希子表的哈希桶地址,同时还作为指纹值的一部分存储在哈希子表中的桶中。
应注意,本发明实施例中将当前键值存储在哈希表的原始键值表中,哈希子表的哈希桶地址中的一个空闲分片上同时存储有当前键值的指纹值信息和索引信息,该索引信息指示当前键值存储在原始键值表中的地址。
206,分解子空间选择处理,用于将2的正整数次幂子空间组合成实际需求的非2的正整数次幂空间。
换句话说,根据当前键值的映射空间对应的哈希函数和所述当前键值生成非2的正整数次幂的哈希子表的哈希桶地址,也就是说根据前当前键值的映射空间确定当前键值在第一个哈希子表和第二个哈希子表中的哈希桶地址。
例如,根据当前键值对应的映射子空间,将映射子空间哈希计算的结果输出,输出同时完成各个子空间的叠加。如m子空间输出为m子空间的地址;n子空间输出为m子空间大小加上n子空间的地址,p子空间输出为m子空间大小加上n子空间大小加上p子空间的地址。从而整体输出的空间地址在非2的正整数次幂范围内。
具体而言,根据子空间映射结果,选择出对应的子空间哈希运算后的值,并拼接成需求的目标空间。仍然以非2的正整数次幂空间为24 000 000空间为例,如果哈希预处理后当前键值对应的映射子空间为m=16兆子空间,则直接把16兆子空间哈希运算的结果作为24 000 000空间的哈希桶地址;如果哈希预处理后当前键值对应的空间为n=8兆子空间,则选择8兆子空间哈希运算的结果加上16兆后作为24 000 000空间的哈希桶地址。这样,经过空间选择后,哈希运算后的值只会在24兆空间以内,很好的匹配了目标空间24 000 000。
207,存储当前键值:将当前键值存储在哈希表中。
具体地,将当前键值存储在原始键值表中,将当前键值的指纹值存储在第一个哈希子表或者第二个哈希子表中。
例如,当前键值经过哈希函数hash1-m1映射到第一个哈希子表中,则该当前键值的指纹值包括该当前键值经过值哈希函数hash1-m1运算的结果和经过hash-pre2运算后的结果,将当前键值的指纹值存储在m1子空间对应的哈希桶地址中的分片上,同时将当前键值存储在原始键值表中,并将当前键值存储在原始键值表中的地址即索引信息存储在该分片上。再例如,当前键经过值哈希函数hash2-n2映射到第二个哈希子表中,则该当前键值的指纹值包括该当前键值经过值哈希函数hash2-n2运算的结果和经过hash-pre1运算后的结果,将当前键值的指纹值存储在n2子空间对应的哈希桶地址中的分片上,同时将当前键值存储在原始键值表中,并将当前键值存储在原始键值表中的地址即索引信息存储在该分片上。
因此,本发明实施例通过根据哈希表的N个非2的正整数次幂空间的哈希子表中的每个哈希子表的空间确定至少两个2的正整数次幂的哈希子表子空间,进而对当前键值做分析,根据针对该N个哈希子表生成的哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在N个哈希子表中的一个哈希子表中,能够生成非2的正整数次幂空间的哈希子表,使得该N个哈希子表构成的非2的正整数次幂空间的哈希表可以更好的匹配表项的需求,减少空间浪费,降低了实现的代价。
例如,在实际应用中,某一城市的12000000名用户客户端需要上网,当用户客户端跟服务器连接时,服务器首先根据本发明实施例方法建立一个此12000000名用户客户端的哈希表,便于以后信息的交互,这里12000000为非2的正整数次幂,服务器可以为路由器或交换机等网络设备。则键值可以为五元组(源IP地址,源端口,目的IP地址,目的端口和传输层协议号)信息的拼接,应注意,五元组中的前后顺序可以为任意,本发明实施例并不对此做限定。现有技术中为了满足12000000空间的需求需要创建16兆空间的哈希,大约4000000(25%)的空间浪费掉,增加了实现的代价。采用本发明实施例提供的方法可以创建两个空间为6兆的哈希子表,该两个6兆的哈希子表构成了12兆的哈希表能够很好的满足12000000空间的需求,能够减少空间浪费,降低实现的代价,具体的两个哈希子表分别为第1个哈希子表,和第2个哈希子表,可以根据第1个哈希子表的空间(6兆)确定两个哈希子表子空间,分别为第1个哈希子表子空间为2兆和第2个哈希子表子空间为4兆。根据第1个哈希子表的第1个预处理哈希函数将当前键值映射到第1个哈希子表子空间和第2个哈希子表子空间之一。之后根据该第1个哈希子表子空间和第2个哈希子表子空间之一对应的哈希函数和当前键值生成第1个哈希子表的哈希桶地址。同样地,可以生成第2个哈希子表的哈希桶地址。最后根据第1个哈希子表的哈希桶地址对应的空闲分片数目和第2个哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在第1个哈希子表中或第2个哈希子表中,例如第1个哈希子表的哈希桶地址对应的空闲分片数目大于第2个哈希子表的哈希桶地址对应的空闲分片数目,则将当前键值存储在哈希表的原始键值表中,并将当前键值的指纹和索引存储在该第1个哈希子表的哈希桶地址对应的空闲分片中的一个分片上。具体地,每一个客户端与哈希子表中的一个指纹值和索引对应,在建立完哈希子表以后,当同一个客户端与服务器交互时,服务器接收到客户端的报文信息,读取报文中的键值信息,找到哈希子表中与该键值信息对应的指纹值和索引的存储地址,例如为xy,那么服务器在以后的信息转发将xy表示为该客户端,这样用xy一个字符代替较繁琐的键值来代表该客户,实用、简便,其中,x表示该客户端的指纹值和索引的存储地址为哈希子表中第x个桶,y表示第x桶中的第y个分片。
在例如,某一小区的1000名用户客户端需要上网,当用户客户端跟服务器连接时,服务器首先根据本发明实施例方法建立一个此1000名用户客户端的哈希表,便于以后信息的交互,这里1000为非2的正整数次幂,服务器可以为路由、交换机等。则键值可以为五元组(源IP地址,源端口,目的IP地址,目的端口和传输层协议号)信息的拼接,应注意,五元组中的前后顺序可以为任意,本发明实施例并不对此做限定。同样可以采用本发明实施例的方法建立哈希表。
应注意,对于一个当前键值,经过哈希函数运算后,本发明实施例中的哈希子表中的哈希桶地址的分片上可以仅存储该键值,也可以将该键值的指纹值和索引信息存储在一个哈希桶地址的分片上并将该键值存储在原始键值表中,其中索引信息指示当前键值存储在原始键值表中的地址,图2的例子仅给出了后一种情况,本发明实施例并不对此做限定。
可选地,当路由器中的路由表或MAC地址表采用哈希表的方式存储时,可以采用上述创建哈希表的方法创建该路由表或该MAC地址表。
上文中结合图1、图2和图3详细描述了根据本发明实施例的创建哈希表的方法,下面将给出根据本发明实施例的创建哈希表的设备的具体实施例,具体将结合图4至图5描述根据本发明实施例的创建哈希表的设备。
图4是为本发明一个实施例的创建哈希表的设备示意性框图。应注意,图4所示的创建哈希表的设备与图1和图2实施例对应,能够实现图1和图2实施例的创建哈希表的方法的各个过程,为避免重复适当省略详细描述。如图4所示的创建哈希表的设备400包括:确定单元410、映射单元420、生成单元430和存储单元440。
具体地,确定单元410用于根据哈希表的N个哈希子表中第n个哈希子表的空间确定至少两个哈希子表子空间,其中,第n个哈希子表的空间的大小为非2的正整数次幂,至少两个哈希子表子空间的大小为2的正整数次幂,其中,N为大于或等于2的整数,n=1,2,…,N。映射单元420用于根据第n个预处理哈希函数将当前键值映射到至少两个哈希子表子空间之一,第n个预处理哈希函数用于将多个键值映射到至少两个哈希子表子空间中。生成单元430用于根据至少两个哈希子表子空间之一对应的哈希函数和当前键值生成哈希子表的哈希桶地址。存储单元440用于根据针对N个哈希子表生成的N个哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在N个哈希子表中的一个哈希子表中。
因此,本发明实施例通过根据哈希表的N个非2的正整数次幂空间的哈希子表中的每个哈希子表的空间确定至少两个2的正整数次幂的哈希子表子空间,进而对当前键值做分析,根据针对该N个哈希子表生成的哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在N个哈希子表中的一个哈希子表中,能够生成非2的正整数次幂空间的哈希子表,使得该N个哈希子表构成的非2的正整数次幂空间的哈希表可以更好的匹配表项的需求,减少空间浪费,降低了实现的代价。
可选地,作为另一实施例,至少两个哈希子表子空间包括M个哈希子表子空间,至少两个哈希子表子空间之一为第m个哈希子表子空间,其中,M为大于或等于2的整数,m为1,2,…,M中的数。生成单元根据第m个哈希子表子空间对应的哈希函数和当前键值生成当前键值对应于第m个哈希子表子空间的哈希桶地址,计算第1个哈希子表子空间至第m-1个哈希子表子空间的大小之和,并将当前键值对应于第m个哈希子表子空间的哈希桶地址与第1个哈希子表子空间至第m-1个哈希子表子空间的大小之和相加,得到哈希子表的哈希桶地址。
可选地,作为另一实施例,第n个预处理哈希函数为CRC函数。映射单元根据第n个预处理哈希函数和当前键值得到预处理结果,将预处理结果对至少两个哈希子表子空间中的各空间的比例之和做取模运算,并根据取模运算的结果将当前键值映射到至少两个哈希子表子空间之一。
应注意,预处理哈希函数为具有分流作用的离散性比较好的函数,可以为CRC函数、平方取中函数或折叠相加函数,本发明实施例并不对此做限定。
可选地,作为另一实施例,存储单元确定N个哈希子表生成的N个哈希子表的哈希桶地址中的空闲分片数目最多的哈希桶地址和空闲分片数目最多的哈希桶地址对应的第p个哈希子表,获取当前键值对应于第p个哈希子表的指纹值,将当前键值存储在哈希子表的原始键值表中,并将当前键值对应于第p个哈希子表的指纹值和当前键值的索引信息存储在空闲分片数目最多的哈希桶地址对应的空闲分片上,其中,索引信息指示当前键值存储在原始键值表中的地址,p为1,2,…,N中的数。
进一步地,作为另一实施例,存储单元根据第n个预处理哈希函数和至少两个哈希子表子空间之一对应的哈希函数生成当前键值的第n个指纹值,并将第n个指纹值作为当前键值对应第p个哈希子表的指纹值,其中n不等于p。
可替代地,作为另一实施例,存储单元确定第n个指纹值生成函数,根据第n个指纹值生成函数和至少两个哈希子表子空间之一对应的哈希函数生成当前键值的第n个指纹值,并将第n个指纹值作为当前键值对应于第p个哈希子表的指纹值,其中n不等于p。
可替代地,作为另一实施例,存储单元确定N个哈希子表生成的N个哈希子表的哈希桶地址中的空闲分片数目最多的哈希桶地址和空闲分片数目最多的哈希桶地址对应的第p个哈希子表,并将当前键值存储在空闲分片数目最多的哈希桶地址对应的空闲分片上,p为1,2,…,N中的数。
可选地,作为另一实施例,N=2,哈希表为2-left哈希表。
图5是为本发明另一实施例的创建哈希表的设备示意性框图。应注意,图4所示的创建哈希表的设备与图1和图2实施例对应,能够实现图1和图2实施例的创建哈希表的方法的各个过程,为避免重复适当省略详细描述。如图5所示的创建哈希表的设备500包括:处理器510、存储器520和总线530。
具体地,处理器510用于通过总线530调用存储在存储器520中的代码,根据哈希表的N个哈希子表中第n个哈希子表的空间确定至少两个哈希子表子空间,其中,第n个哈希子表的空间的大小为非2的正整数次幂,至少两个哈希子表子空间的大小为2的正整数次幂,其中,N为大于或等于2的整数,n=1,2,…,N;根据第n个预处理哈希函数将当前键值映射到至少两个哈希子表子空间之一,第n个预处理哈希函数用于将多个键值映射到至少两个哈希子表子空间中;根据至少两个哈希子表子空间之一对应的哈希函数和当前键值生成第n个哈希子表的哈希桶地址;根据针对N个哈希子表生成的N个哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在N个哈希子表中的一个哈希子表中。
因此,本发明实施例通过根据哈希表的N个非2的正整数次幂空间的哈希子表中的每个哈希子表的空间确定至少两个2的正整数次幂的哈希子表子空间,进而对当前键值做分析,根据针对该N个哈希子表生成的哈希子表的哈希桶地址对应的空闲分片数目将当前键值存储在N个哈希子表中的一个哈希子表中,能够生成非2的正整数次幂空间的哈希子表,使得该N个哈希子表构成的非2的正整数次幂空间的哈希表可以更好的匹配表项的需求,减少空间浪费,降低了实现的代价。
上述本发明实施例揭示的方法可以应用于处理器510中,或者由处理器510实现。处理器510可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器510中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器510可以是通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(FieldProgrammable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件模块组合执行完成。软件模块可以位于随机存取存储器(Random Access Memory,RAM)、闪存、只读存储器(Read-Only Memory,ROM)、可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器520,处理器510读取存储器520中的信息,结合其硬件完成上述方法的步骤。
可选地,作为另一实施例,至少两个哈希子表子空间包括M个哈希子表子空间,至少两个哈希子表子空间之一为第m个哈希子表子空间,其中,M为大于或等于2的整数,m为1,2,…,M中的数。处理器410根据第m个哈希子表子空间对应的哈希函数和当前键值生成当前键值对应于第m个哈希子表子空间的哈希桶地址,计算第1个哈希子表子空间至第m-1个哈希子表子空间的大小之和,并将当前键值对应于第m个哈希子表子空间的哈希桶地址与第1个哈希子表子空间至第m-1个哈希子表子空间的大小之和相加,得到哈希子表的哈希桶地址。
可选地,作为另一实施例,第n个预处理哈希函数为CRC函数。处理器510根据第n个预处理哈希函数和当前键值得到预处理结果,将预处理结果对至少两个哈希子表子空间中的各空间的比例之和做取模运算,并根据取模运算的结果将当前键值映射到至少两个哈希子表子空间之一。
应注意,预处理哈希函数为具有分流作用的离散性比较好的函数,可以为CRC函数、平方取中函数或折叠相加函数,本发明实施例并不对此做限定。
可选地,作为另一实施例,处理器510确定N个哈希子表生成的N个哈希子表的哈希桶地址中的空闲分片数目最多的哈希桶地址和空闲分片数目最多的哈希桶地址对应的第p个哈希子表,获取当前键值对应于第p个哈希子表的指纹值,将当前键值存储在哈希子表的原始键值表中,并将当前键值对应于第p个哈希子表的指纹值和当前键值的索引信息存储在空闲分片数目最多的哈希桶地址对应的空闲分片上,其中,索引信息指示当前键值存储在原始键值表中的地址,或者该索引为键值在原始键值表中的地址,能够指示键值在原始键值表中的位置。p为1,2,…,N中的数。
进一步地,作为另一实施例,处理器510根据第n个预处理哈希函数和至少两个哈希子表子空间之一对应的哈希函数生成当前键值的第n个指纹值,并将第n个指纹值作为当前键值对应第p个哈希子表的指纹值,其中n不等于p。
可替代地,作为另一实施例,处理器510确定第n个指纹值生成函数,根据第n个指纹值生成函数和至少两个哈希子表子空间之一对应的哈希函数生成当前键值的第n个指纹值,并将第n个指纹值作为当前键值对应于第p个哈希子表的指纹值,其中n不等于p。
可替代地,作为另一实施例,处理器510确定N个哈希子表生成的N个哈希子表的哈希桶地址中的空闲分片数目最多的哈希桶地址和第p个哈希子表哈希桶地址对应的第p个哈希子表,并将当前键值存储在空闲分片数目最多的哈希桶地址对应的空闲分片上,p为1,2,…,N中的数。
可选地,作为另一实施例,N=2,哈希表为2-left哈希表。
可选地,图4或图5所示的设备可以为路由器或交换器等网络设备。
应理解,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
应理解,在本发明的各种实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。