【原】Postgresql源码中的动态Hash(hash_search)调用方法详解
(2017-03-29 20:59:43)
标签:
postgresqlpostgres数据库哈希表hash |
分类: Postgres和数据库 |
Postgresql
中的hash表是经常使用的一种结构
本文主要讨论下PG中的hash表的实现原理和使用方法
1) 设计实现:
源码中的评论如下:
说明这些函数是模仿系统的hsearch
函数实现的
2) 调用和注意事项:
2.1) 创建hash表:
2.2) 插入条目
2.3)查找条目
PlanDeparse*
GetDeparseUseHTAB(Node *node, HTAB *hash)
{
}
#define
GetDeparseUseDeparseInfo(_node, _info)
GetDeparseUseHTAB(((Node*)(_node)),
(_info)->plan_hash)
DeparseFlatInfo
*flat_info;
Plan *
this_plan;
PlanFlatDeparse
*this_deparse =NULL;
this_deparse
= (PlanFlatDeparse *)GetDeparseUseDeparseInfo( this_plan, flat_info
);
2.4) 注意事项:
使用
hash_search这个函数进行查找的时候
返回的 entry 一定要是一个包含key的结构体!!!
例如:
typedef struct entry
{
} ENTRY;
对于这个函数:
entry = hash_search(hashp_,
(void*)&node_, HASH_ENTER,
found);
调用完成之后,会把key填充到entry中,然后data的部分由用户填充
2.5) hash 函数和match函数
hash函数和match函数都是可以指定的:
hash函数末了都是调用hash_any这个函数
至于string_hash ---->
只是判断key是以\0结尾的情况
tag_hash --->
完全调用hash_any
oid_hash -->
key是oid的情况
2.6) 注意remove的情况:
对于remove的情况:
entry = hash_search(g_PMConnHTab,
(void*)(&serveroid), HASH_REMOVE, &found);
这种情况下 entry不要手动释放, 这个由hash自己回收