首页> 中国专利> 一种黑名单URL的哈希表的建立及请求URL的查找方法

一种黑名单URL的哈希表的建立及请求URL的查找方法

摘要

本发明提供了一种黑名单URL的哈希表的建立方法,所述方法包括:步骤S1)遍历黑名单中的URL字符串,按照分隔符的个数将黑名单中的URL分为三类;计算三类URL所占的比例,计算出分配给三类URL的哈希表的“桶”数;步骤S2)通过哈希函数处理得到每个URL的哈希值h,计算其对应的“桶”的索引值;然后将每个URL插入到哈希表的“桶”上,当所有的URL插入到哈希表的“桶”上时,黑名单URL的哈希表建立完毕。本发明的方法既具备哈希算法的高效性能,同时又能支持前缀匹配,提高了查找效率。

著录项

  • 公开/公告号CN106970917A

    专利类型发明专利

  • 公开/公告日2017-07-21

    原文格式PDF

  • 申请/专利号CN201610022119.8

  • 发明设计人 陈晓;田娟娟;

    申请日2016-01-13

  • 分类号

  • 代理机构北京方安思达知识产权代理有限公司;

  • 代理人王宇杨

  • 地址 100190 北京市海淀区北四环西路21号

  • 入库时间 2023-06-19 02:52:30

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-11-19

    授权

    授权

  • 2017-08-15

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20160113

    实质审查的生效

  • 2017-07-21

    公开

    公开

说明书

技术领域

本文涉及网络安全技术领域,具体涉及的是一种黑名单URL的哈希表的建立及请求URL的查找方法。

背景技术

近年来,随着科技的进步,Internet以惊人的速度飞速发展。它所包含的网站也日益增长,URL(Uniform Resource Locator,统一资源定位符)就是一个网站的唯一标识。具体来说,URL是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。一个基本URL包含模式(或称协议)域名(或IP地址)、路径和文件名。例如一个URL:http://www.ioa.cas.cn/kycg,其中http是协议部分,而www.ioa.cas.cn就是域名,kycg则是路径。

Internet的飞速发展,使人们可以通过Internet获得各种各样的信息和资源。但是互联网上的信息良莠不齐,存在着大量有害的网站,人们在享受互联网的各种信息的同时,访问这些有害网站,人们的身心和财产安全也可能受到危害。对大量有害的URL进行过滤,是目前网络安全应用系统中所亟需的关键技术。而且URL过滤不仅用于过滤有害网站,还可以用于企业管理员工上班时间上网行为,限定员工上班时间可以访问的网站范围等。

URL过滤是一种简单、直接的信息过滤方法。URL过滤系统利用预先设定好的URL地址列表决定允许还是禁止用户访问网络资源。一般来说,URL地址列表可以分为两种:白名单和黑名单。白名单是允许访问的URL地址列表,而黑名单是禁止访问的URL地址列表。

URL查找是URL过滤系统的一个核心操作。众所周知,Internet上网站数以亿计,其中绝大部分网站是无害的,我们不可能列举出所有无害的网站和它们的URLs。与无害的网站相比,有害的网站数量极少,因此通常情况下URL过滤系统采用的是URL黑名单。上面已经介绍,一个基本URL包含模式(或称协议)、域名(或IP地址)、路径和文件名,对于采用黑名单的URL过滤系统来说,需要支持前缀匹配。这意味着当把一个恶意URL,例如http://www.ioa.cas.cn/加入黑名单,虽然这个URL只包含了协议和域名部分,但把这个URL加入到黑名单,那么这个URL域名www.ioa.cas.cn下所有路径下的URL也都是禁止访问的,例如虽然没有把http://www.ioa.cas.cn/kycg/加入到黑名单,但是因为http://www.ioa.cas.cn/kycg在域名www.ioa.cas.cn下,因此也是要禁止访问的。

现有的URL查找技术主要是基于哈希的方法。这类方法的原理是将URL通过哈希函数映射到特定的数据结构来加速查找,常用的数据结构有哈希表、布隆滤波器等。这类基于哈希的方法虽然处理效率很高,但是它们没有考虑URL的语法格式,而是将URL当成一个整体,将每个URL从第一个字符到最后一个字符哈希,因此不支持前缀匹配。

为了支持URL的前缀匹配,研究者们提出了建立URL分解树的方法。这类方法的基本原理是:根据URL的语法格式,将每个URL分解为子项,然后建立一棵URL分解树。URL查找过程是一个树的遍历过程,每次匹配树的一个子节点,直到匹配到叶节点。这种方法虽然能解决前缀匹配的问题,但是由于它们使用了树的结构,所以URL的查找效率受到了制约。

发明内容

本发明的目的在于克服目前利用URL查找方法中存在的上述问题,提出了一种黑名单URL的哈希表的建立及请求URL的查找方法,该方法既具备哈希算法的高效性能,同时又能支持前缀匹配。

为了实现上述目的,本发明提供了一种黑名单URL的哈希表的建立方法,该方法具体包括以下步骤:

步骤S1)遍历黑名单中的URL字符串,按照分隔符的个数将黑名单中的URL分为三类;计算三类URL所占的比例,计算出分配给三类URL的哈希表的“桶”数;

步骤S2)通过哈希函数处理得到每个URL的哈希值h,计算其对应的“桶”的索引值;然后将每个URL插入到哈希表的“桶”上,当所有的URL插入到哈希表的“桶”上时,黑名单URL的哈希表建立完毕。

上述技术方案中,所述步骤S1)具体包括:

步骤S1-1)将黑名单中的URL分为三类:第一类是URL字符串只包含一个分隔符‘/’,第二类是URL字符串包含两个分隔符‘/’,第三类是包含三个及三个以上分隔符‘/’;

步骤S1-2)通过遍历黑名单中的URL字符串,得到三类URL占总URL的比例;

步骤S1-3)计算哈希表分配给三类URL的“桶”的数目;

分配给第一类URL“桶”的数目为:num1=HASHTABLESIZE*ratio_1,其中,ratio_1为第一类URL所占的比例;

分配给第二类URL“桶”的数目为:num2=HASHTABLESIZE*ratio_2,其中,ratio_2为第二类URL所占的比例;

分配给第三类URL“桶”的数目为:num3=HASHTABLESIZE*ratio_3,其中ratio_3为第三类URL所占的比例。

上述技术方案中,所述步骤S2)具体包括:

步骤S2-1)通过哈希函数处理,得到黑名单中每个URL的哈希值h;

步骤S2-2)根据步骤S1-2)所得到的分配给各类URL的“桶”的数目和每个URL的哈希值h,计算其对应的“桶”的索引值;

根据第一类URL字符串的哈希值h计算其索引值:hash_index=h%num1,将第一类URL字符串的哈希值限定1~num1范围内;

根据第二类URL字符串的哈希值h计算其索引值:hash_index=h%num2+num1,将第一类URL字符串的哈希值限定num1~num1+num2范围内;

根据第三类URL字符串的哈希值h计算其索引值:hash_index=h%num3+num1+num2;将第三类URL字符串的哈希值限定在num1+num2~num1+num2+num3范围内;

步骤S2-3)根据每个URL的“桶”的索引值,将每个URL插入到哈希表的“桶”上,当所有的URL插入到哈希表的“桶”上时,黑名单URL的哈希表建立完毕。

上述技术方案中,所述步骤S2-3)中的将每个URL插入到哈希表的“桶”上的实现过程为:

首先查看URL的索引值对应的“桶”是否为空;如果“桶”为空,计算该URL的前缀哈希值,申请一个节点prefix_node,这个节点的前缀值为这个URL的前缀哈希值,同时这个节点也指向一个链表url_list,将这个URL字符串加入到链表url_list中;如果“桶”不为空,那么首先要遍历这个“桶”所指向的链表prefix_list中的prefix_node节点,检查节点的前缀值是否和这个URL的前缀哈希值相等,如果有一个节点的前缀值和这个URL的前缀哈希值相等,那么将这个URL添加到这个节点所指向的链表url_list中;如果这个链表上所有节点的前缀值都和这个URL字符串的前缀值不相等,那么给这个链表增加一个prefix_node节点,这个节点的前缀值为URL字符串的前缀哈希值,并且再建立一个这个节点指向的url_list链表,将这个URL添加到url_list链表上。

基于上述的黑名单URL的哈希表的建立方法建立的哈希表,本发明还提供了一种请求URL的查询方法,用于在哈希表中查询请求URL;所述方法包括:

步骤T1)逐个处理请求URL中的字符,得到包含的分隔符‘/’数目;根据分隔符的数目计算每个分隔符之前的所有字符的哈希值,计算其对应的“桶”的索引值;

步骤T2)根据请求URL的分隔符的个数和索引值在所述哈希表中查询请求URL,返回查询结果,查询完毕。

上述技术方案中,所述步骤T1)的具体实现过程为:

当请求URL只包含一个分隔符‘/’,计算这个分隔符之前的所有字符组成的字符串的哈希值h,根据哈希值h计算“桶”的索引值hash_index1;

当请求URL包含两个分隔符‘/’,计算第一个分隔符之前的所有字符的哈希值h1,其对应的“桶”的索引值为hash_index1;得到第二个分隔符之前的所有字符串得到的哈希值h2,其对应的“桶”的索引值为hash_index2;

当请求URL包含三个以及以上各分隔符,计算由第一个分隔符之前的所有字符组成的字符串的哈希值h1,其对应的“桶”的索引值为hash_index1;计算第二个分隔符之前的所有字符串的哈希值h2,其对应的“桶”的索引值为hash_index2;计算第三个分隔符之前的所有字符串的哈希值h3,其对应的“桶”的索引值为hash_index3;如果请求URL包含3个以上分隔符,第三个分隔符后面的字符不再继续处理。

上述技术方案中,所述步骤T2)具体包括:

步骤T2-1)判断分隔符的个数是否等于1,如果判断结果是肯定的,转入步骤T2-2);否则,转入步骤T2-5);

步骤T2-2)根据其索引值hash_index1查找哈希表的第hash_index1个“桶”;如果这个“桶”为空,则这个请求URL不在黑名单中,转到步骤T2-14);否则,转入步骤T2-3);

步骤T2-3)遍历这个桶所指链表prefix_list的节点prefix_node,判断prefix_node节点的前缀值和请求URL的前缀值是否相等,如果存在一个节点的前缀值和请求URL的前缀值相等,转入步骤T2-4);否则,请求URL不在黑名单中,转入步骤T2-14);

步骤T2-4)将请求URL和这个prefix_node节点所指向的前缀值相同的链表上url_list上的URL节点开始逐个进行匹配:首先判断请求URL长度是否大于等于URL节点上URL的长度,如果请求URL的长度小于URL节点上URL的长度,则前缀匹配失败,进行下一个节点上的前缀匹配;否则,比较请求URL和URL节点上URL是否相等;如果请求URL和URL节点上URL相等,则匹配成功,判定请求URL在黑名单中,转入步骤T2-14);否则继续下一个节点上的URL匹配;如果这个url_list上所有URL节点都和请求URL不相等,则匹配失败,请求URL不在黑名单中,转入步骤T2-14);

步骤T2-5)判断分隔符的个数是否等于2,如果判断结果是肯定的,转入步骤T2-6);否则,转入步骤T2-9);

步骤T2-6)根据请求URL的2个索引值hash_index1和hash_index2;检查哈希表的第hash_index1个“桶”,如果这个“桶”不为空,转入步骤T2-2);如果这个“桶”为空,转入步骤T2-7);

步骤T2-7)检查哈希表的第hash_index2个“桶”;遍历这个桶所指链表prefix_list的节点prefix_node,判断节点的前缀值和请求URL的前缀值是否相同,如果存在一个节点的前缀值和请求URL的前缀值相等,转入步骤T2-8);否则,请求URL不在黑名单中,转入步骤T2-14);

步骤T2-8)将请求URL的第1个分隔符之前的部分和这个prefix_node节点所指向的前缀值相同的链表上url_list上的URL节点开始逐个进行匹配;如果匹配成功,则请求URL在黑名单中,转入步骤T2-14);如果匹配不成功,则请求URL不在黑名单中,转入步骤T2-14);

步骤T2-9)根据请求URL的3个索引值hash_index1、hash_index2和hash_index3;检查哈希表的第hash_index1个“桶”,如果这个“桶”不为空,转入步骤T2-2);如果这个“桶”为空;检查哈希表的第hash_index2个“桶”;如果这个“桶”不为空,转入步骤T2-10);否则,转入步骤T2-12);

步骤T2-10)遍历这个桶所指链表prefix_list的节点prefix_node,判断节点的前缀值和请求URL的前缀值是否相同,如果存在一个节点的前缀值和请求URL的前缀值相等,转入步骤T2-11);否则,请求URL不在黑名单中,转入步骤T2-14);

步骤T2-11)将请求URL的第2个分隔符之前的部分和这个prefix_node节点所指向的前缀值相同的链表上url_list上的URL节点开始逐个进行匹配;如果匹配成功,则请求URL在黑名单中,转入步骤T2-14);如果匹配不成功,则请求URL不在黑名单中,转入步骤T2-14);

步骤T2-12)检查哈希表的第hash_index3个“桶”,如果这个“桶”为空,则这个请求URL不在黑名单中,转到步骤T2-14);如果这个“桶”不为空,遍历这个桶所指链表prefix_list的节点prefix_node,判断节点的前缀值和请求URL的前缀值是否相同,如果存在一个节点的前缀值和请求URL的前缀值相等,转入步骤T2-13);否则,请求URL不在黑名单中,转入步骤T2-14);

步骤T2-13)将请求URL的第3个分隔符之前的部分和这个prefix_node节点所指向的前缀值相同的链表上url_list上的URL节点开始逐个进行匹配;如果匹配成功,则请求URL在黑名单中,转入步骤T2-14);如果匹配不成功,则请求URL不在黑名单中,转入步骤T2-14);

步骤T2-14)获取匹配查询结果,查询完毕

本发明的优点在于:本发明的方法既具备哈希算法的高效性能,同时又能支持前缀匹配,提高了查找效率。

附图说明

图1为本发明的种黑名单URL的哈希表的建立方法的流程图;

图2为本发明的哈希表的示意图

图3为本发明的请求URL查询过程的流程图。

具体实施方式

下面结合附图和具体实施例对本发明的进一步的详细描述。

如图1所示,一种黑名单URL的哈希表的建立方法,所述方法包括:

步骤S1)遍历黑名单中的URL字符串,按照分隔符的个数将黑名单中的URL分为三类;计算三类URL所占的比例,计算出分配给三类URL的哈希表的“桶”数;具体包括:

步骤S1-1)将黑名单中的URL分为三类:第一类是URL字符串只包含一个分隔符‘/’,第二类是URL字符串包含两个分隔符‘/’,第三类是包含三个及三个以上分隔符‘/’;

步骤S1-2)通过遍历黑名单中的URL字符串,得到三类URL占总URL的比例;

步骤S1-3)计算哈希表分配给三类URL的“桶”的数目;

分配给第一类URL“桶”的数目为:num1=HASHTABLESIZE*ratio_1,其中,ratio_1为第一类URL所占的比例;

分配给第二类URL“桶”的数目为:num2=HASHTABLESIZE*ratio_2,其中,ratio_2为第二类URL所占的比例;

分配给第三类URL“桶”的数目为:num3=HASHTABLESIZE*ratio_3,其中ratio_3为第三类URL所占的比例。

步骤S2)通过哈希函数处理得到每个URL的哈希值h,计算其对应的“桶”的索引值;然后将每个URL插入到哈希表的“桶”上,当所有的URL插入到哈希表的“桶”上时,黑名单URL的哈希表建立完毕。

步骤S2-1)通过哈希函数处理,得到黑名单中每个URL的哈希值h;

步骤S2-2)根据步骤S1-2)所得到的分配给各类URL的“桶”的数目和每个URL的哈希值h计算其对应的“桶”的索引值;

根据第一类URL字符串的哈希值h计算其索引值:hash_index=h%num1,将第一类URL字符串的哈希值限定1~num1内;

根据第二类URL字符串的哈希值h计算其索引值:hash_index=h%num2+num1,将第一类URL字符串的哈希值限定num1~num1+num2范围内;

根据第三类URL字符串的哈希值h计算其索引值:hash_index=h%num3+num1+num2;将第三类URL字符串的哈希值限定在num1+num2~num1+num2+num3范围内。

步骤S2-3)根据每个URL的“桶”的索引值,将每个URL插入到哈希表的“桶”上,建立哈希表;

首先查看URL的索引值对应的“桶”是否为空;如果“桶”为空,计算该URL的前缀哈希值,申请一个节点prefix_node,这个节点的前缀值为这个URL的前缀哈希值,同时这个节点也指向一个链表url_list,将这个URL字符串加入到链表url_list中;如果“桶”不为空,那么首先要遍历这个“桶”所指向的链表prefix_list中的prefix_node节点,检查节点的前缀值是否和这个URL的前缀哈希值相等,如果有一个节点的前缀值和这个URL的前缀哈希值相等,那么将这个URL添加到这个节点所指向的链表url_list中。如果这个链表上所有节点的前缀值都和这个URL字符串的前缀值不相等,那么给这个链表增加一个prefix_node节点,这个节点的前缀值为URL字符串的前缀哈希值,并且再建立一个这个节点指向的url_list链表,将这个URL添加到url_list链表上;如图2所示,当所有黑名单的URL插入哈希表后,哈希表建立完毕。

基于上述方法建立的哈希表,本发明还提供了一种请求URL的查询方法,用于在哈希表中查询请求URL;所述方法包括:

步骤T1)逐个处理请求URL中的字符,得到包含的分隔符‘/’数目;根据分隔符的数目计算每个分隔符之前的所有字符的哈希值,计算其对应的“桶”的索引值;

当请求URL只包含一个分隔符‘/’,计算这个分隔符之前的所有字符组成的字符串的哈希值h,根据哈希值h计算“桶”的索引值hash_index1;

当请求URL包含两个分隔符‘/’,计算第一个分隔符之前的所有字符的哈希值h1,其对应的“桶”的索引值为hash_index1;得到第二个分隔符之前的所有字符串得到的哈希值h2,其对应的“桶”的索引值为hash_index2;

当请求URL包含三个以及以上各分隔符,计算由第一个分隔符之前的所有字符组成的字符串的哈希值h1,其对应的“桶”的索引值为hash_index1;计算第二个分隔符之前的所有字符串的哈希值h2,其对应的“桶”的索引值为hash_index2;计算第三个分隔符之前的所有字符串的哈希值h3,其对应的“桶”的索引值为hash_index3;如果请求URL包含3个以上分隔符,第三个分隔符后面的字符不再继续处理。

步骤T2)根据请求URL的分隔符的个数和索引值在所述哈希表中查找请求URL;

如图3所示,所述步骤T2)具体包括:

步骤T2-1)判断分隔符的个数是否等于1,如果判断结果是肯定的,转入步骤T2-2);否则,转入步骤T2-5);

步骤T2-2)根据其索引值hash_index1查找哈希表的第hash_index1个“桶”;如果这个“桶”为空,则这个请求URL不在黑名单中,转到步骤T2-14);否则,转入步骤T2-3);

步骤T2-3)遍历这个桶所指链表prefix_list的节点prefix_node,判断prefix_node节点的前缀值和请求URL的前缀值是否相等,如果存在一个节点的前缀值和请求URL的前缀值相等,转入步骤T2-4);否则,请求URL不在黑名单中,转入步骤T2-14);

步骤T2-4)将请求URL和这个prefix_node节点所指向的前缀值相同的链表上url_list上的URL节点开始逐个进行匹配:首先判断请求URL长度是否大于等于URL节点上URL的长度,如果请求URL的长度小于URL节点上URL的长度,则前缀匹配失败,进行下一个节点上的前缀匹配;否则,比较请求URL和URL节点上URL是否相等;如果请求URL和URL节点上URL相等,则匹配成功,判定请求URL在黑名单中,转入步骤T2-14);否则继续下一个节点上的URL匹配;如果这个url_list上所有URL节点都和请求URL不相等,则匹配失败,请求URL不在黑名单中,转入步骤T2-14);

步骤T2-5)判断分隔符的个数是否等于2,如果判断结果是肯定的,转入步骤T2-6);否则,转入步骤T2-9);

步骤T2-6)根据请求URL的2个索引值hash_index1和hash_index2;检查哈希表的第hash_index1个“桶”,如果这个“桶”不为空,转入步骤T2-2);如果这个“桶”为空,转入步骤T2-7);

步骤T2-7)检查哈希表的第hash_index2个“桶”;遍历这个桶所指链表prefix_list的节点prefix_node,判断节点的前缀值和请求URL的前缀值是否相同,如果存在一个节点的前缀值和请求URL的前缀值相等,转入步骤T2-8);否则,请求URL不在黑名单中,转入步骤T2-14);

步骤T2-8)将请求URL的第1个分隔符之前的部分和这个prefix_node节点所指向的前缀值相同的链表上url_list上的URL节点开始逐个进行匹配;如果匹配成功,则请求URL在黑名单中,转入步骤T2-14);如果匹配不成功,则请求URL不在黑名单中,转入步骤T2-14);

步骤T2-9)根据请求URL的3个索引值hash_index1、hash_index2和hash_index3;检查哈希表的第hash_index1个“桶”,如果这个“桶”不为空,转入步骤T2-2);如果这个“桶”为空;检查哈希表的第hash_index2个“桶”;如果这个“桶”不为空,转入步骤T2-10);否则,转入步骤T2-12);

步骤T2-10)遍历这个桶所指链表prefix_list的节点prefix_node,判断节点的前缀值和请求URL的前缀值是否相同,如果存在一个节点的前缀值和请求URL的前缀值相等,转入步骤T2-11);否则,请求URL不在黑名单中,转入步骤T2-14);

步骤T2-11)将请求URL的第2个分隔符之前的部分和这个prefix_node节点所指向的前缀值相同的链表上url_list上的URL节点开始逐个进行匹配;如果匹配成功,则请求URL在黑名单中,转入步骤T2-14);如果匹配不成功,则请求URL不在黑名单中,转入步骤T2-14);

步骤T2-12)检查哈希表的第hash_index3个“桶”,如果这个“桶”为空,则这个请求URL不在黑名单中,转到步骤T2-14);如果这个“桶”不为空,遍历这个桶所指链表prefix_list的节点prefix_node,判断节点的前缀值和请求URL的前缀值是否相同,如果存在一个节点的前缀值和请求URL的前缀值相等,转入步骤T2-13);否则,请求URL不在黑名单中,转入步骤T2-14);

步骤T2-13)将请求URL的第3个分隔符之前的部分和这个prefix_node节点所指向的前缀值相同的链表上url_list上的URL节点开始逐个进行匹配;如果匹配成功,则请求URL在黑名单中,转入步骤T2-14);如果匹配不成功,则请求URL不在黑名单中,转入步骤T2-14);

步骤T2-14)获取匹配结果,查询完毕。

在建立哈希表和查找请求URL用哈希函数做哈希处理的过程中,只处理前3个分隔符之前的数据,这是因为一般加入到黑名单中的URL都很短,很少会包含3个以上的分隔符。而实际请求URL一般却很长,处理整个请求URL会增大查找时间。因为黑名单中的URL很短,不用处理完整个URL就可以判断请求URL是否在黑名单中或者是黑命单中URL的子部分。只处理请求URL字符串的部分,既可以达到查找的目的,又减小了处理时间。

下面以实例对上述方法进行说明。

假设黑名单中URL为100万条,哈希表的表项有80万,3类URL的比例为1/2、1/4、1/4,那么分配给三类URL“桶”的个数分别为40万个、20万、20万。那么第一类URL将被插入到哈希表的第0~40万个“桶”上,第二类URL将被插入到哈希表的第40~60万个的“桶”上,第三类URL将被插入到哈希表的第60~80万个的“桶”上。

以黑名单中的URL http://image.baidu.com/channel和https://www.taobao.com为例:

(1)据分隔符“://”将原始URL分为两项,http和image.baidu.com/channel,忽略分隔符“://”前面的部分,即协议部分;只处理image.baidu.com/channel这一部分。

(2)检查剩下部分image.baidu.com/channel这一部分包含分隔符“/”的个数。可以知道包含分隔符“/”的个数为2,没有超过3个,对除去协议部分的余下的URL整个做哈希处理,得到哈希值h;因为要将这个URL插入到哈希表的第40万~60万的某个“桶”上,根据哈希值计算索引值:hash_index=h%num2+num1,得到最终的索引值hash_index=467147

这里使用的哈希函数是文献《两种对URL的散列效果很好的函数》中介绍的哈希函数_hf,定义如下:

int_hf(char*url,int size)

{

int result=0;

char*ptr=url;

int c;

for(int i=1;c=*ptr++;i++)

result+=c*3*i;

if(result<0)

result=-result;

return result%size;

}

检查哈希表,Hashtable[hash_index]处的“桶”是否为空。此时Hashtable[hash_index]处为空,将此URL(image.baidu.com/channel/star)插入到这个“桶”指向链表的第一个节点上,并记录这个节点的前缀值prefix=30583。计算前缀值是取URL字符串的前两个字节,计算公式如下:

unsigned short prefix_hash(unsigned char*url)

{

return(unsigned short)((*url)<<8|*(url+1));

}

这里为了处理哈希冲突,即有多个URL被哈希到同一表项,则采用链式存储结构。

https://www.taobao.com插入到哈希表的第73229个“桶”上,前缀值prefix=30583。

例1:请求URL为:https://www.taobao.com/market/nvzhuang

将请求URL去除协议https部分,只对余下部分www.taobao.com/market/nvzhuang处理。这部分包含3个分隔符,使用建立哈希表过程中使用的哈希函数。首先得到www.taobao.com部分的哈希值h1,www.taobao.com/market部分的哈希值h2,www.taibao.com/market/nvzhuang部分的哈希值h3,计算索引值:

hash_index1=h1%num=73229

hash_index2=h%num2+num1=408664

hash_index3=h%num2+num1+num2,hash_index3=605580。

首先检查哈希表的第hash_index1个“桶”。这个桶上有一个节点,这个节点的前缀值prefix=30583,和请求URL:www.taobao.com/market/nvzhuang的前缀值相同,则将请求URL第一个分隔符“/”之前的部分www.taobao.com和这个节点所指向的链表上的URL节点www.taobao.com开始匹配,前缀匹配成功。请求URL在黑名单中;不再继续检查哈希表的第hash_index1和第hash_index2个“桶”。

例2:请求http://image.baidu.com/channel

计算两个索引值hash_index1=76550,hash_index2=467147。首先检查哈希表的第hash_index1“桶”;这个桶上有一个节点,这个节点的前缀值prefix=30583,和请求URL(image.baidu.com/channel)的前缀值不同,在这个“桶”上没有产生匹配,再检查哈希表的第hash_index2个“桶”;

哈希表的第hash_index2个“桶”上有一个节点,这个节点的前缀值prefix=26989,和请求URL(image.baidu.com/channel)的前缀值相同,则将请求URL个这个节点所指向的链表上的URL节点image.baidu.com/channel开始匹配,前缀匹配成功。请求URL在黑名单中。

例3:请求http://weibo.com

计算索引值hash_index1=30563,检查哈希表的第hash_index1个“桶”;这个“桶”为空,请求URL不在黑名单中。

在上述查找过程中,会根据请求URL包含的分隔符“/”的数目得到不同数量的哈希值。得到哈希值之后,计算得到索引值,然后查找索引值处的哈希表的“桶”。以得到2个索引值hash_index1,hash_index2为例。首先会查找hash_index1处的“桶”,hash_index1处的“桶”上的黑名单中的URL只包含一个分隔符,代表的往往是此处的URL只包含域名。先将请求URL和只包含域名的黑名单中URL进行前缀比较,即检查请求URL是否和黑名单中URL相等或者是黑名单中URL域名下的某一路径或者子路径等。

例1中查找请求https://www.taobao.com/market/nvzhuang中检查哈希表hash_index1=76550处的“桶”,将请求URL:https://www.taobao.com/market/nvzhuang和hash_index1=73229处节点上的URL:https://www.taobao.com前缀比较就是这个过程。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号