vpp hash源码分析

本文详细介绍了vpp的哈希结构,包括hash_header、桶及桶下元素的内存分布。讨论了动态扩容机制、无冲突和冲突时的处理方式,并通过hash_set、hash_unset、hash_get等关键函数阐述了操作流程。同时,文章提供了实例分析冲突解决过程,帮助读者深入理解vpp的哈希实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 概述

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。

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! ! 

 

  • hash结构图

hash struct (原图更清晰)

  1. hash_t:hash_header
/* 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在遍历此散列表的过程中进行
以下是一个使用VPP中的hash table的示例代码: ```c #include <vlib/vlib.h> #include <vppinfra/hash.h> typedef struct { u32 key; u32 value; u32 hits; } hash_test_entry_t; typedef struct { u32 next_index; hash_test_entry_t *entries; uword *hash; } hash_test_main_t; hash_test_main_t hash_test_main; static clib_error_t * hash_test_init (vlib_main_t *vm) { hash_test_main_t *htmp = &hash_test_main; htmp->hash = hash_create (0, sizeof (uword)); return 0; } static uword hash_test (vlib_main_t *vm, vlib_node_runtime_t *node, vlib_frame_t *frame) { hash_test_main_t *htmp = &hash_test_main; hash_test_entry_t *e; uword *p; int i; // 添加元素到hash table中 for (i = 0; i < 10; i++) { pool_get_aligned (htmp->entries, e, CLIB_CACHE_LINE_BYTES); memset (e, 0, sizeof (*e)); e->key = i; e->value = i * i; hash_set (htmp->hash, i, e - htmp->entries); } // 查找元素 for (i = 0; i < 20; i++) { p = hash_get (htmp->hash, i); if (p == 0) continue; e = vec_elt_at_index (htmp->entries, p[0]); e->hits++; } // 删除元素 for (i = 0; i < 10; i++) { p = hash_get (htmp->hash, i); if (p == 0) continue; e = vec_elt_at_index (htmp->entries, p[0]); hash_unset (htmp->hash, i); pool_put (htmp->entries, e); } return 0; } VLIB_REGISTER_NODE (hash_test_node) = { .function = hash_test, .type = VLIB_NODE_TYPE_INPUT, .name = "hash-test", }; VLIB_INIT_FUNCTION (hash_test_init); ``` 这个示例代码展示了如何使用VPP中的hash table。在这个示例中,我们首先创建了一个hash table,然后向其中添加了一些元素。之后,我们对hash table进行了一些查找操作,对每个元素的“hits”字段进行了递增操作。最后,我们删除了所有元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值