免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3822 | 回复: 8
打印 上一主题 下一主题

[算法] 问个在缓冲区中查找另一个缓冲区的算法 [复制链接]

论坛徽章:
2
巳蛇
日期:2014-10-26 22:38:12天蝎座
日期:2016-01-08 09:25:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-30 10:10 |只看该作者 |倒序浏览
我最近做个项目,是从一个大缓冲区中找是否包含一个小缓冲区,现在是循环一遍大缓冲区,先判断第一个字节是否相等,相等再继续判断,代码如下:

  1. char *big = {xxx};
  2. char *small = {xxx};
  3. int i = 0;
  4. int b_len = 1000000; //big缓冲区的长度
  5. int s_len = 100;        //small缓冲区的长度

  6. for (; i<b_len; i++) {
  7.     if (big[i] == small[0]) {
  8.         if (memcmp(&big[i], small, s_len) == 0) {
  9.             printf("Found");
  10.             break;
  11.         }
  12.     }
  13. }
复制代码
感觉循环一遍效率太低,各位大神是不是有类似查找的更好算法?

现在的杀毒软件的病毒库,也都是几十万的数量。
我也很好奇硬盘扫描时是如何杀毒的?
每个文件都要和几十万病毒码做比较吧,
每个文件至少也几百KB吧,不会每个文件都从第一个字节到最后一个字节循环来判断吧?

论坛徽章:
0
2 [报告]
发表于 2011-09-30 10:13 |只看该作者
hash~~

进一步提示,md5/sha1之类并不是加密算法,而是hash算法

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
3 [报告]
发表于 2011-09-30 10:20 |只看该作者
缓冲区一直在变,不能用hash吧。

用KMP算法查找,效率比较高。

论坛徽章:
0
4 [报告]
发表于 2011-09-30 13:01 |只看该作者
回复 3# noword2k


    不是让你做hash表,而是用hash算法求出摘要并管理起来,将来搜摘要即可。

比如,子缓冲区1的md5是aabbccddeeff,待测数据的md5也是这个值,那么就可以很安全的认为这两块数据是等同的。



hash并不非要是hash表那一大摞子东西,核心就是一个算特征值然后用特征值直接比较的思想。

hash表是这个思想的一个典型应用:如果我把特征值直接算成地址,那么数据查找不就是O(1)效率了吗?

病毒特征库是另一个应用: 我把特征值用MD5之类算法算出来,那么只要一个执行文件部分内容的MD5(或其他经过优化的摘要算法)和这个特征值相同,我就可以安全的认为抓到了病毒。


再如,推广一点,你想用google搜我这个帖子,不需要你把全部内容默出来。只要记得里面的几个关键字,用google搜之即可。
提取关键字,这显然也是一种摘要算法。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
5 [报告]
发表于 2011-09-30 13:13 |只看该作者
回复  noword2k


    不是让你做hash表,而是用hash算法求出摘要并管理起来,将来搜摘要即可。

比如 ...
狗蛋 发表于 2011-09-30 13:01



    假设大缓存区的长度是n,你要计算几次hash值?
LZ只是memcmp,你还要算每段的hash,不是脱裤子放屁——多此一举吗?

论坛徽章:
0
6 [报告]
发表于 2011-09-30 13:48 |只看该作者
回复 5# noword2k


    呵呵,刚开始没仔细看,以为他的大缓冲区也是分块的。

这种情况下,因为一般来说,小块缓冲更新往往会比大块频繁,所以搞个hash可以避免每次小缓冲内容改变都要重新和大缓冲里的每个块比对。

论坛徽章:
0
7 [报告]
发表于 2011-09-30 13:49 |只看该作者
Boyer–Moore  比 KMP 更高效一些

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
8 [报告]
发表于 2011-09-30 13:57 |只看该作者
人不学习就落后啊,敢情还有Boyer–Moore。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP