一.Hash简介
概念:把任意长度的输入,通过hash算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出。
哈希表:
若结构中存在和关键字K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为哈希表。
哈希冲突:
对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。
解决Hash冲突常用的是拉链法(哈希链表),即hash表中的每个元素是一个链表,相同的hash值构成一个链表。查找时,从hash表中的链表第一个节点开始遍历比较key值,直到key相同查找结束
时间复杂度:
使用hash算法对关键字进行查找,理论上时间复杂度是O(1),但实际取决于散列函数的的选取,最坏的情况是O(n)。
二.常用字符串hash
关键字是字符串。常用hash函数:
1.加法hash
unsigned additiveHash(string key, unsigned prime){
unsigned hash, i;
for (hash = key.length(), i = 0; i < key.length(); i++)
hash += key[i];
return (hash % prime);
}
2. 乘法hash
unsigned bernstein(string key, unsigned prime){
unsigned hash, i;
for (hash=0, i=0; i < key.length(); ++i)