算法复杂度攻击

原创 2004年04月22日 13:06:00

1. Hashing

我们经常使用这样的字符串的Hash函数:

// 随手写的,未严格测试
unsigned long Hash(char* str)
{
    assert(NULL != str);

    unsigned long hash_val = 0xDEEDBEEFul;   // hash seed
    unsigned char* p = (unsigned char*)str;

    while (*p != '/0') {
        hash_val = 37 * hash_val + *p;
        ++p;
    }

    return hash_val;

}

《程序设计实践》第3章的Markov Chain的实现就使用了几乎一摸一样的Hash函数。这个函数的优点是速度快,英文单词的Hash值的分布也不错。但是,它太简单,容易受到攻击。攻击一般有两种方案:1) 构造一个输入序列,让序列中的每个字符串彼此不同,但Hash值相同;2) 构造一个输入序列,序列中每个字符串彼此不同,Hash值也不一定相同,但是这些Hash值对所用Hash Table的buckets数目同余(即hash_val % bucket_size 相等)。这样就能让Hash Table退化为链表。从而大大增加查找时间。(http://www.cs.rice.edu/~scrosby/hash/)

要解决这个问题,需要用复杂得多的Hash函数(MD5、SHA-1),让攻击者(几乎)无法构造出Hash值相同的序列。

2. Regular Expressions

Regular Expression Engine 一般有三种:DFA (Deterministic Finite Automaton)、traditional NFA (Nondeterministic Finite Automaton)、POSIX NFA。这三种engines的功能一个比一个强,速度一个比一个慢。(http://msdn.microsoft.com/library/en-us/cpguide/html/cpconmatchingbehavior.asp) (http://www.oreilly.com/catalog/regex/chapter/ch04.html)

DFA 速度最快,可以保证线性时间(?)。NFA需要使用backtracking(回溯)技术,以支持backreference(向前引用),通常NFA是线性时间,但是其最坏情况是指数时间!

举例来说,表达式 (x+x+)+y 可以匹配 xxx...xxxy 但不能匹配 xxx...xxxx。在某个版本的Python中,这个表达式的匹配是指数时间。(http://mail.python.org/pipermail/python-dev/2003-May/035916.html)

3. Quicksort

Quicksort的平均运行时间是O(N log N),但可能退化为 O(N^2),这是数据结构课程的必讲内容。C library 的 qsort 就不能保证一定是“快速”排序。(http://www.cs.dartmouth.edu/~doug/mdmspe.pdf)。C++ library 的 sort() 在改造之前,也可能退化为 O(N^2) 的龟速排序。SGI STL 的 sort() 使用了 a new, hybrid sorting algorithm, introsort (for introspective sort), that behaves almost exactly like median-of-3 quicksort for most inputs (and is just as fast) but which is capable of detecting when partitioning is tending toward quadratic behavior. By switching to heapsort in those situations, introsort achieves the same O(N logN) time bound as heapsort but is almost always faster than just using heapsort in the first place. (http://www.cs.rpi.edu/~musser/gp/algorithms.html) 。该排序算法的分析见 (http://www.cs.rpi.edu/~musser/gp/introsort.ps)

关于计算时间复杂度和空间复杂度

相信学习编程的同学,或多或少都接触到算法的时间复杂度和空间复杂度了,那我来讲讲怎么计算。        常用的算法的时间复杂度和空间复杂度 一,求解算法的时间复杂度,其具体步骤是:   ⑴ 找出算法...
  • yangwei282367751
  • yangwei282367751
  • 2016年09月04日 00:09
  • 14739

算法时间复杂度计算方法

一、概念: 时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(不含系数) 比如:一般总运算次数表达式类似于这样: a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+f a...
  • u013372487
  • u013372487
  • 2016年05月30日 15:09
  • 4784

算法的时间复杂度和空间复杂度-总结

算法的时间复杂度和空间复杂度 1、时间复杂度 (1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法...
  • zolalad
  • zolalad
  • 2013年09月20日 16:01
  • 95687

程序时间复杂度的计算小结

一下是一些程序设计中的概念问题的小结://抽象数据类型:【abstract data type】ADT是一个数据模型和在该模型上定义的操作的集合的总称;【如:整型,实型,数组】 //数据:data是对...
  • gogoky
  • gogoky
  • 2013年10月31日 12:53
  • 1832

软考软件设计师McCabe环路复杂度计算方法

软考软件设计师McCabe环路复杂度计算方法
  • u012965373
  • u012965373
  • 2015年11月05日 14:41
  • 6334

常见问题时间复杂度的计算过程

时间复杂度的计算过程是由特殊到一般的过程,使用特殊的数值得到普遍的规律,而结果却是一个概数,但这种结果已经足够让我们作为依据评论一个算法的优劣。 同时也让我们明白,算法...
  • u012466304
  • u012466304
  • 2015年10月13日 23:18
  • 2871

McCabe度量方法计算程序复杂度

软考软件设计师McCabe环路复杂度,09年的两个题,为什么不一样?—from 百度知道 为什么上半年的答案是8-7+2=3 弧数为8,节点为7,没问题; 下半年的却是9-7+2=4 下半年的弧为...
  • t_1007
  • t_1007
  • 2016年11月04日 14:32
  • 4676

mccabe计算环路复杂度

下图所示的程序流程图中有()条不同的简单路径。采用McCabe度量法计算该程序图的环路复杂性为()。 环形复杂度定量度量程序的逻辑复杂度。描绘程序控制流的流图之后,可以用下述3种方法中的任何一种来...
  • qq_26222859
  • qq_26222859
  • 2016年05月05日 11:24
  • 2887

算法时间复杂度的计算

转载自:http://blog.csdn.net/firefly_2002/article/details/8008987 一、概念时间复杂度是总运算次数表达式中受n的变化影响最大的那一项(...
  • Singular__point
  • Singular__point
  • 2016年12月28日 19:42
  • 487

计算递归算法时间复杂度通用公式

最近看《算法导论》公开课视频,虽然本科没有学过此类课程,但也能感觉得出来教学水平高于母校,在此就吐槽这一句,进入正题。 第一二课讲到一种分析递归算法的时间复杂度的方法——递归树。长期处于学习技术阶段没...
  • lechengbupt
  • lechengbupt
  • 2015年08月08日 13:06
  • 2038
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法复杂度攻击
举报原因:
原因补充:

(最多只允许输入30个字)