Q什么是哈希?
A哈希是将字符串映射到整数的过程,通常在一个相对小的范围内。一个“哈希函数”将一个字符串(或其他数据结构)映射到一个有界的数字(“哈希桶”),该数字可以更容易地用作数组中的索引,或者用于执行重复的比较。(显然,从一个潜在的巨大字符串集映射到一个小的整数集是不可能唯一的。因此,任何使用哈希的算法都必须处理“冲突”的可能性。)
已经开发了许多哈希函数和相关算法;完整的讨论超出了此列表的范围。一个极其简单的字符串哈希函数是简单地将所有字符的值相加。
unsigned hash(char *str) { unsigned int h = 0; while(*str != '\0') h += *str++; return h % NBUCKETS; }一个稍微好一点的哈希函数是
unsigned hash(char *str) { unsigned int h = 0; while(*str != '\0') h = (256 * h + *str++) % NBUCKETS; return h; }它实际上将输入字符串视为一个大的二进制数字(8 * strlen(str)位长,假设字符是8位),并通过霍纳法则计算该数字模 NBUCKETS。(这里重要的是 NBUCKETS 是素数,除其他事项外。要取消对字符是8位的假设,请使用UCHAR_MAX+1代替 256;“大二进制数字”将是CHAR_BIT * strlen(str)位长。UCHAR_MAX和CHAR_BIT定义在<limits.h>.)
当字符串集合是预先知道的,也可以设计“完美”哈希函数,它保证无冲突、密集的映射。
参考文献:K&R2 Sec. 6.6
Knuth Sec. 6.4 pp. 506-549 Volume 3
Sedgewick Sec. 16 pp. 231-244