数据库-4 Hash算法

来源:互联网 发布:网络理财 富通贷 编辑:程序博客网 时间:2024/06/05 17:52

Hash算法: 以时间换空间。

散列函数是Hash算法的核心。

以除法求余散列法和乘法散列为例:


除法求余散列:

全域K=2000, 碰撞值3 

m=2000/3 ≈666,取666左右的素数701.

得散列函数 h(k) = k mod 701


散列后702和1得到同一个值,在存放时需要进行额外处理。

结果散列后最大值是701,相比散列前的最大值2000,节省空间。

但在查找时会额外消耗时间,同一个Hash值对应多个原始值,可能需要进行额外查找,才能得到查找的值。

除法求余散列建议除数采用素数。


乘法散列    h(k) = floor( m(kA mod 1) )

关键字k乘以常数A(0.1),取出小数部分,再乘以m,取整数部分

A值建议取(√5 -1)/2   黄金分割值

如 k=123 456     p=14     m=2^14=16384  w=32   A=((√5-1)/2*2^32)/2^32

k*A=(76300 X 2^32) + 17612864

17612864/2^32 * 2^14≈ 67

得到Hash值 67 

A值先乘以2^32然后在除以2^32,是为了保证小数点后的计算足够精确, 采用2的某次方 是为了方便运算,直接对存储的二进制数进行左移和右移即可。


全域散列:

       解决散列中可能出现的散列结果不平均的情况。



Oracle中的应用

1. Hash join

         多表关联时,将关联列(关联条件 a.col= b.col )的值做Hash处理,再做循环匹配。

2.解析

        语法/语义/权限检查

       将整条SQL做hash处理(会对字符串进行数值化处理 如字符 pt ASCII字符集中p=112,t=116 则pt=(112X128)+116 =14452)

        一个Hash值可能对应多个SQL文本及执行计划

       进行逐条匹配,有则取,没有则重新生成执行计划并保存

(实际做Hash join和解析时,Hash处理的方法会因为问题的实际情况变复杂,只是基本思路如此)

3.Hash分区

4.Hash表


参考内容:

Hash算法         算法导论中文版            11章 散列表    P139

Hash Join        基于Oracle的SQL优化    崔华              P52

解析                  基于Oracle的SQL优化    崔华               P205