我正在使用 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/