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

5827

被折叠的 条评论
为什么被折叠?



