开始
Postgresql 名人 momjian 的文章指出了其pseudo code:
for@H_403_7@ (j = 0@H_403_7@; j < length(inner); j++)
hash_key @H_403_7@= hash(inner[j]);
append(hash_store[hash_key],inner[j]);
@H_403_7@for@H_403_7@ (i = 0@H_403_7@; i < length(outer); i++)
hash_key @H_403_7@= hash(outer[i]);
@H_403_7@0@H_403_7@; j < length(hash_store[hash_key]); j++)
@H_403_7@if@H_403_7@ (outer[i] == hash_store[hash_key][j])
output(outer[i],inner[j]);@H_403_7@
为了看的更加清楚一点,加上自己的注释:
//@H_403_7@利用 inner 表, 来构造 hash 表(放在内存里) @H_403_7@
0@H_403_7@; j < length(inner); j++)
{
hash_key @H_403_7@= hash(inner[j]);
append(hash_store[hash_key],inner[j]);
}
@H_403_7@对 outer 表的每一个元素, 进行遍历 @H_403_7@
0@H_403_7@; i < length(outer); i++)
{
@H_403_7@拿到 outer 表中的 某个元素, 进行 hash运算, 得到其 hash_key 值 @H_403_7@
hash_key = hash(outer[i]);
@H_403_7@用上面刚得到的 hash_key值, 来 对 hash 表进行 探测(假定hash表中有此key 值)
@H_403_7@采用 length (hash_store[hash_Key]) 是因为,hash算法构造完hash 表后,有可能出现一个key值处有多个元素的情况。
@H_403_7@例如: hash_key 100 ,对应 a,c,e; 而 hash_key 200 , 对应 d; hash_key 300, 对应 f;
@H_403_7@也就是说, 如下的遍历,其实是对 拥有相同 的 (此处是上面刚运算的,特定的)hash_key 值的各个元素的遍历 @H_403_7@
0@H_403_7@; j < length(hash_store[hash_key]); j++)
{
@H_403_7@如果找到了匹配值,则输出一行结果 @H_403_7@
if@H_403_7@ (outer[i] == hash_store[hash_key][j])
output(outer[i],inner[j]);
}
} @H_403_7@