当前位置: 技术问答>linux和unix
关于散列函数问题
来源: 互联网 发布时间:2016-08-08
本文导语: 本帖最后由 pengpeng2018 于 2010-02-27 23:35:25 编辑 小弟为了实现linux动态包过滤防火墙状态跟踪,需要建立一张散列状态表,表已实现,但哈希函数总搞不定.我按照下图方法构造哈希函数,但总得出很大的数值(实在对移位操作...
函数形式如下
char* sa = "192.168.1.1";
char* da = "10.0.1.1";
char* sp = "80";
char* dp = "23";
__be32 ipsa = inet_addr(sa);
__be32 ipda = inet_addr(da);
__be16 portsp = htons(strtoul(sp,NULL,10));
__be16 portdp = htons(strtoul(dp,NULL,10));
int no = hash(ipsa,ipda,portsp,portdp);
int hash(__be32 sourceaddr,__be32 destaddr,__be16 sourceport,__be16 destport)
{
//1. ip地址相加
//2. port端口相加
//3. 二者移位,截取成20位(好像没有__be20),并按图上异或
//4. 二进制结果转换成十进制返回
return bucketnumber;
}
上面3和4我做不出来...
|
int hash(__be32 sourceaddr,__be32 destaddr,__be16 sourceport,__be16 destport)
{
//1. ip地址相加
__be64 sumip = (__be64)sourceaddr+(__be64)destaddr;
//2. port端口相加
__be32 sumport = (__be32)sourceport+(__be32)destport;
//3. 二者移位,截取成20位(好像没有__be20),并按图上异或(对地址之和分段)
__be32 addr1 = (__be32)(sumip >> 13);
__be32 addr2 = (__be32)((sumip & 0x1FFF)