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。
/* 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源码分析的主要内容,如果未能解决你的问题,请参考以下文章
Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段
Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段
Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段