由整数键控并映射到空指针的 C 映射/哈希表

标签 c data-structures map hashtable hashmap

我正在使用 epoll 将我用 Python 编写的轻量级图像服务器重写为 c(不是 c++)。我想编写一个(或使用现有的)非常简单的映射或哈希表,将整数键(文件描述符)映射到 void 指针。这样做的好方法是什么?我不需要能够支持任何通用类型的键甚至字符串。我有一个想法:

// Initialize map.
size_t map_size = 50;
void ** map = (void **)malloc(sizeof(void *) * map_size);
memset((void *)map, 0, map_size);

// Set values for keys 3, 20, 67
int key_a = 3;
int key_b = 20;
int key_c = 67;
void * value_a = ...;
void * value_b = ...;
void * value_c = ...;

// NOTE: This does not take into account conflicting keys. I would probably solve
// that using an array or linked-list and comparing keys.
map[key_a % map_size] = value_a;
map[key_b % map_size] = value_b;
map[key_c % map_size] = value_c;

这是明智的还是有更好的方法来实现这一点?或者有人可以指出正确的方向以找到答案吗?

最佳答案

文件描述符在大多数系统上都是小整数,并且通常是连续的,因为它们在内核中用作索引。因此,我建议只从 0..maxfd(动态增长)创建一个数组,并将文件描述符用作整数——根本不进行散列。

作为安全防护,您可能希望防止系统使用不同的策略来分配文件描述符,例如如果大于 2^20 则中止。

关于由整数键控并映射到空指针的 C 映射/哈希表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4567135/

相关文章:

c - 为什么在我有 16 GB RAM 的计算机上只能分配 2 GB?

c - 数据类型截断

c - SSE 并行化

c++ - 为什么双重否定强制值变成 bool 值?

Java根据条件查找重复项并覆盖/更新重复对象中的部分数据

java - Freemarker:如何使用枚举作为键来遍历 map

java - 如何制作不区分大小写的 ConcurrentMap?

data-structures - 反转查询区间内点的颜色

data-structures - 用于估计降阶有序二元决策图效率的启发式方法?

c++ - 翻转 map 键值对