算法复杂度攻击

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退化为链表。从而大大增加查找时间。(

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值