vpp hash源码分析

Posted 大白鲨源码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vpp hash源码分析相关的知识,希望对你有一定的参考价值。

概述

vpp的hash结构分为hash头、桶(_hash_create或hash_resize申请)和桶下元素(clib_mem_realloc申请),总共3个部分组成。


根据元素key的hash值不同,分配到不同的桶下,与其他hash表原理相同。


vpp的hash结构默认是支持动态扩容的,即当hash表存放键值对大于3/4哈希桶的个数时,会2倍扩容。


哈希冲突时,vector长度认为是没有限制的。


如非特殊说明,以存储key和value来进行介绍,即log2_pair_size > 0。


hash结构图


  
    
    
  
/* Vector header for hash tables. */ typedef struct hash_header {
/* 哈希表元素数量,包括所有桶下的元素 */
uword elts
;

/* 标记位,包括以下3种取值 */
u32 flags
;

/* 自动扩容,默认打开 */ # define HASH_FLAG_NO_AUTO_GROW (1 << 0)
/* 自动缩减,默认关闭 */ # define HASH_FLAG_NO_AUTO_SHRINK (1 << 1)
/* 当hash_next在遍历此散列表的过程中进行时设置 */ # define HASH_FLAG_HASH_NEXT_IN_PROGRESS (1 << 2)

/* 0:不存储key >0:存储key+value大小的log2值 */
u32 log2_pair_size
;

/* 哈希函数,包括以下5种取值 */
hash_key_sum_function_t
* key_sum ;

/* Special values for key_sum "function". */ # define KEY_FUNC_NONE (0) /*< sum = key */ # define KEY_FUNC_POINTER_UWORD (1) /*< sum = *(uword *) key */ # define KEY_FUNC_POINTER_U32 (2) /*< sum = *(u32 *) key */ # define KEY_FUNC_STRING (3) /*< sum = string_key_sum, etc. */ # define KEY_FUNC_MEM (4) /*< sum = mem_key_sum */

/* 比较函数 */
hash_key_equal_function_t
* key_equal ;

/* 用户自定义数据 */
any user
;

/* Format函数 */
format_function_t
* format_pair ;

/* Format函数参数 */
void * format_pair_arg ;

/* 1:有一个元素 0:无元素或有冲突元素 */
uword is_user
[ 0 ] ; } hash_t ;

以上是关于vpp hash源码分析的主要内容,如果未能解决你的问题,请参考以下文章

VPP-API(Golang)

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段

FD.io/VPP — ACL

Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段

HashTable源码分析