my_free mysql源代码_MySQL源码 数据结构hash

MySQL源码自定义了hash表,因为hash表具有O(1)的查询效率,所以,源码中大量使用了hash结构。下面就来看下hash表的定义:

【源代码文件include/hash.h mysys/hash.c】

typedef uintmy_hash_value_type;

typedef uchar*(*my_hash_get_key)(const uchar *,size_t*,my_bool);

typedefvoid (*my_hash_free_key)(void *);

typedefstructst_hash {

size_t key_offset,key_length;/*Length of key if const length*/size_t blength;ulongrecords;uintflags;

DYNAMIC_ARRAY array;/*Place for hash_keys*/my_hash_get_key get_key;void (*free)(void *);

CHARSET_INFO*charset;

} HASH;

typedefstructst_hash_info {uint next; /*index to next key*/uchar*data; /*data for current entry*/} HASH_LINK;

hash的特点:

1. hash的每一个元素都存放在array动态数组中

2. 给定一个key值,通过hash算法来计算它在array中的位置

3. array中的元素存放的是hash_link对象,而使用hash表的对象必须自己申请内存,把地址存放在hash_link->data中

4. 根据key获取一个元素hash_link->data时,需要强制转换成保存进去的类型。

5. hash表虽然使用calc_hash来计算hash值,但会按照array的位置(hash_mask函数)来进行存放。

用一个图来表示下:

cd0ce33fb7c4a1b875be829741715276.png

下面看下hash表的函数:

1.  _my_hash_init(HASH *hash, uint growth_size, CHARSET_INFO *charset,

ulong size, size_t key_offset, size_t key_length,

my_hash_get_key get_key,

void (*free_element)(void*), uint flags)

hash:初始化一个hash表

growth_size:初始化hash->array的增长大小

get_key:需要自定义一个从record获取key的方法,然后hash表针对这个key计算hash

free_element:hash中的元素,只记录data的指针,需要自己定义free的方法

2. my_hash_free_elements(HASH *hash)

根据hash->elements的值,从array的0到elements来释放hash_link中的data。

最后hash->elements置为0。

3. my_hash_key(const HASH *hash, const uchar *record, size_t *length,

my_bool first)

根据record和hash中定义的get_key方法来获取key值。

4. my_hash_first(const HASH *hash, const uchar *key, size_t length,

HASH_SEARCH_STATE *current_record)

根据key,length值来查找hash中的data。如果有hash冲突,就返回第一个。

5. my_hash_insert(HASH *info, const uchar *record)

插入record到hash表中:

1. 如果需要hash_unique,会先使用my_hash_search进行查询。

2. 然后计算cacl_hash&&hash_mask来计算位置。

6. my_hash_element(HASH *hash, ulong idx)

获取在hash表位置是idx的元素。

为完待续.....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值