xarry能用于字符串吗

张开发
2026/6/9 14:24:29 15 分钟阅读
xarry能用于字符串吗
array 本身就是为整数索引优化的数据结构用它来存字符串需要做一层“映射”转换。Xarray 的核心是一个“非常大的指针数组”它的索引Key必须是整数类型unsigned long。因此不能直接把字符串作为键去 Xarray 里查找。通常的做法是将字符串映射成一个唯一的整数 ID然后将这个 ID 作为索引把数据指针存入 Xarray。一个典型的应用流程如下1.映射使用哈希表如内核的 rhashtable或 IDR 机制为每个字符串分配一个唯一的整数 ID。2.存储以这个整数 ID 为 index将你的数据指针通过 xa_store() 存入 Xarray。3.查找需要查找字符串时先通过哈希表将字符串转换为 ID再用 xa_load() 从 Xarray 中高效地获取数据。#include linux/xarray.h#include linux/hashtable.h#include linux/slab.h#include linux/string.h/* 1. 定义哈希表用于字符串到ID的映射 */#define STR_TO_ID_MAP_BITS 8DECLARE_HASHTABLE(str_to_id_map, STR_TO_ID_MAP_BITS);/* 2. 定义Xarray用于ID到数据的映射 */DEFINE_XARRAY(my_data_xa);/* 哈希表节点关联字符串和其ID */struct str_id_node {struct hlist_node hlist;char *str;unsigned long id;};/* 用于存储到Xarray的实际数据 */struct my_data {int value;/* ... 其他数据 ... */};/* 为字符串分配ID并存储数据 */int store_by_string(const char *str, struct my_data *data) {struct str_id_node *node;unsigned long id;int ret;/* 步骤1: 为字符串分配唯一ID例如使用内核的IDA */ret ida_alloc_range(my_ida, 0, LONG_MAX, GFP_KERNEL);if (ret 0)return ret;id ret;/* 步骤2: 将ID和数据存入Xarray */ret xa_store(my_data_xa, id, data, GFP_KERNEL);if (ret 0) {ida_free(my_ida, id);return ret;}/* 步骤3: 保存字符串到ID的映射关系 */node kmalloc(sizeof(*node), GFP_KERNEL);if (!node) {xa_erase(my_data_xa, id);ida_free(my_ida, id);return -ENOMEM;}node-str kstrdup(str, GFP_KERNEL);node-id id;hash_add(str_to_id_map, node-hlist, hash_string(str, STR_TO_ID_MAP_BITS));return 0;}/* 通过字符串查找数据 */struct my_data *find_by_string(const char *str) {struct str_id_node *node;unsigned long key;/* 步骤1: 在哈希表中查找字符串对应的ID */hash_for_each_possible(str_to_id_map, node, hlist, hash_string(str, STR_TO_ID_MAP_BITS)) {if (strcmp(node-str, str) 0) {key node-id;/* 步骤2: 通过ID在Xarray中快速获取数据 */return xa_load(my_data_xa, key);}}return NULL;}如果你的需求仅仅是管理字符串到数据的映射也可以考虑直接使用哈希表。Xarray 哈希表方案纯哈希表方案 (rhashtable)查找速度两阶段查找略慢单阶段直接查找更快有序遍历支持可按ID顺序遍历不支持遍历顺序随机内存占用较高需维护两套结构较低仅一套结构实现复杂度较高需处理映射逻辑较低API直接友好适用场景需同时支持字符串和ID查找仅需字符串查找Xarray 本身不直接支持字符串键它的设计目标是高效管理整数索引的指针数组。最实用的方法是将 Xarray 与哈希表或 IDR 结合形成“字符串↔ID↔数据”的两级映射。如果应用场景只需要通过字符串进行查找并且没有按顺序遍历的需求那么内核的 rhashtable 是更直接、更高效的选择。

更多文章