我正在重写我用Python编写的轻量级图像服务器,使用epoll进入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 :(得分:3)
文件描述符在大多数系统上都是小整数,并且通常是连续的,因为它们在内核中用作索引。因此我建议从0..maxfd(动态增长)创建一个数组,并将文件描述符用作整数 - 根本不进行散列。
作为安全防范,您可能希望防范使用不同策略分配文件描述符的系统,例如:如果它大于2 ^ 20则中止。
答案 1 :(得分:3)
在Ruby的代码库中使用通用C哈希表的公共域实现 - st.c。
答案 2 :(得分:2)
使用简单模数作为“哈希算法”本身没有任何问题,但只有在知道结果将均匀分布时才能正常工作。但是,在你的情况下,你不能在技术上指望使用文件描述符,因为没有特别保证你将从open / fopen调用中获得什么数字。
有非常简单的哈希算法,它们非常快,并且适用于一般用例。你可以考虑FNV family,甚至是简单的Pearson哈希。
那就是说,我有点好奇为什么你想要一个键入文件描述符的哈希表。这看起来像是一个奇怪的设计细节,让我觉得你过于复杂了。
答案 3 :(得分:1)
其他人已经提出了关于这是否真的是你想要做的好点,但只是回答你的问题,大多数系统都应该提供glibc hashtable functions。请注意,您几乎肯定希望使用_r
变体(hcreate_r, hsearch_r, hdestroy_r
),因为vanilla版本会创建并操作单个全局哈希表。