hashtable 哈希表 2020-03-12(未经允许,禁止

2020-03-12  本文已影响0人  9_SooHyun

1.hash table

哈希表,也叫散列表,是通过键(KEY)来直接访问【内存存储位置】的一种线性数据结构

2.hash函数的本质——映射

哈希函数可以将大范围的消息M映射成为一个小范围的值Hash(M),Hash(M)称为哈希值、散列值或者消息摘要(Message Digest)。哈希函数是可公开的,因为它是单向的从明文到密文的不可逆映射,只能加密不能解密

例如,hash(num) = num % 10,也就是哈希值等于原始值除以10的余数。那么,即使我们知道这个余数,我们也推不出原始值究竟是多少

3.解决哈希冲突

由于hash是一种映射,它将大范围消息映射到一个小范围上,如上面提到的例子,hash(num) = num % 10,将所有数字映射到0到9的范围内,必然会产生冲突
通过构造性能良好的哈希函数,可以减少冲突。如:

/* BKDR Hash Function */
unsigned int BKDR_hash(char *str)
{
    unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
    unsigned int hash = 0;
    while (*str)
    {
        hash = hash * seed + (*str++);  //【通过seed减少hash冲突】,但具体原理尚未理解清楚
    }
    return (hash & 0x7FFFFFFF); // 最终结果mod 2的31次方
}

但需要注意的是,哈希函数不能完全避免冲突,冲突一定会存在。那么如何解决这些冲突?
主要有4种方法(4哈希):

可以参考:
https://www.jianshu.com/p/f20fb1a44dca
https://mp.weixin.qq.com/s/B126kU8EFlghjRjz4dZPYg

上一篇 下一篇

猜你喜欢

热点阅读