在vpp 中实现hashtable 代码
时间: 2024-03-11 13:49:27 浏览: 158
以下是使用 VPP 实现 Hash 表的示例代码:
```c
#include <vlib/vlib.h>
#include <vppinfra/hash.h>
typedef struct {
u32 key;
u32 value;
} hash_pair_t;
typedef struct {
u64 hits;
u64 misses;
uword *hash;
} hash_table_t;
typedef struct {
hash_table_t ht;
} hash_main_t;
hash_main_t hash_main;
static uword
hash_pair_hash (void *item)
{
hash_pair_t *p = item;
return hash_combine (0, p->key);
}
static int
hash_pair_cmp (void *a1, void *a2)
{
hash_pair_t *p1 = a1;
hash_pair_t *p2 = a2;
return (p1->key == p2->key);
}
static void
hash_table_init (hash_table_t *ht)
{
ht->hits = 0;
ht->misses = 0;
ht->hash = hash_create (0, sizeof (hash_pair_t), sizeof (uword));
}
static void
hash_table_add (hash_table_t *ht, u32 key, u32 value)
{
hash_pair_t pair = {
.key = key,
.value = value,
};
hash_set_mem (ht->hash, &pair, hash_pair_hash (&pair));
}
static u32
hash_table_find (hash_table_t *ht, u32 key)
{
hash_pair_t query = {
.key = key,
};
uword *p = hash_get_mem (ht->hash, &query);
if (p) {
ht->hits++;
hash_pair_t *pair = (hash_pair_t *) p[0];
return pair->value;
} else {
ht->misses++;
return ~0;
}
}
static clib_error_t *
hash_init (vlib_main_t *vm)
{
hash_table_init (&hash_main.ht);
return 0;
}
VLIB_INIT_FUNCTION (hash_init);
static clib_error_t *
hash_cli (vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
{
u32 key, value;
if (!unformat (input, "add %u %u", &key, &value)) {
return clib_error_return (0, "unknown input `%U'", format_unformat_error, input);
}
hash_table_add (&hash_main.ht, key, value);
return 0;
}
VLIB_CLI_COMMAND (hash_cli_command, static) = {
.path = "hash-table",
.short_help = "hash table commands",
.function = hash_cli,
};
static clib_error_t *
hash_test (vlib_main_t *vm)
{
u32 key, value, result;
key = 42;
value = 1337;
hash_table_add (&hash_main.ht, key, value);
result = hash_table_find (&hash_main.ht, key);
if (result == value) {
vlib_cli_output (vm, "Test 1 passed\n");
} else {
vlib_cli_output (vm, "Test 1 failed: expected %u, got %u\n", value, result);
}
key = 43;
result = hash_table_find (&hash_main.ht, key);
if (result == ~0) {
vlib_cli_output (vm, "Test 2 passed\n");
} else {
vlib_cli_output (vm, "Test 2 failed: expected ~0, got %u\n", result);
}
return 0;
}
VLIB_EARLY_CONFIG_FUNCTION (hash_test);
```
在此示例代码中,我们定义了一个`hash_pair_t`结构体,它包含一个键和一个值。我们还定义了一个`hash_table_t`结构体,它包含命中次数、未命中次数和一个哈希表。我们使用`hash_create()`函数初始化哈希表。`hash_pair_hash()`函数计算哈希值,`hash_pair_cmp()`函数比较两个键是否相等。`hash_table_add()`函数将一个键值对添加到哈希表中,`hash_table_find()`函数在哈希表中查找一个键对应的值。`hash_init()`函数在加载模块时初始化哈希表。`hash_cli()`函数处理 CLI 命令。`hash_test()`函数测试哈希表的功能。
请注意,此示例代码仅用于演示 VPP 中哈希表的实现,实际使用中可能需要更改代码以符合您的需求。
阅读全文