c - 哈希表遍历操作

标签 c data-structures hashtable

我有以下指向表示事件语音流的结构的指针哈希表的实现。

hash_table_t stream_buffers;
struct stream_struct *streamPtr =
              (struct streamPtr *) malloc(sizeof(struct stream_struct));
...
case CTRL_MSG_TYPE_STREAM_START_REQ:
(hash_table_insert(stream_buffers, stream_id, streamPtr));

当我从 UDP 套接字接收到语音数据报时,我会进行查找并将该数据报插入到目标流的本地环形缓冲区中。

if (hash_table_search(stream_buffers, _stream_id, (void **) &streamPtr))
{
  streamPtr->ringBuffer.entries[streamPtr->ringBuffer.head] = datagramBuff;
  memcpy(streamPtr->ringBuffer.entries[streamPtr->ringBuffer.head],
         2 * sizeof(uint16_t) + datagramBuff,
         streamPtr->framelegnth);
  streamPtr->ringBuffer.head =
         (streamPtr->ringBuffer.head + streamPtr->framelegnth)
         % streamPtr->ringBuffer.size;

  if (streamPtr->ringBuffer.filled < streamPtr->ringBuffer.size)
         streamPtr->ringBuffer.filled++;
}

现在我想并行处理来自不同流的这些语音帧。为此,我需要遍历哈希表并收集指向公共(public)数组中事件流的所有指针,该数组将用作 PARALLEL_FOR 循环的参数以进行操作。我当前的哈希表实现没有这样的操作。我该如何实现?

最佳答案

从变量名和语音主语猜测,并假设CMU的Sphinx项目正在进行

除了该项目的 hash_table.h

typedef struct hash_entry_s {
        const char *key;
        size_t len;
        void *val;
        struct hash_entry_s *next;
} hash_entry_t;

typedef struct {
        hash_entry_t *table;
        int32 size;
        int32 inuse;
        int32 nocase;
} hash_table_t;

基于这些结构,您需要从hash_table_t记录内的hash_entry_t指针table开始。

沿着next指针链从该链的头部开始,直到到达NULL。

您想要收集的数据可能保存在每个记录的 void 指针 val 中,但我不确定。检查那里是否是指向您正在查找的数据包组的指针

编辑

我怀疑函数 hash_table_tolist( ... ) 执行了我刚才描述的操作

关于c - 哈希表遍历操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35947521/

相关文章:

C 预处理器:将字符组合成字符串

c - 套接字编程(客户端-服务器 UDP)

json - 如何递归搜索与给定模式匹配的所有节点的 JSON 文件并将 JSON 'path' 返回到节点及其值?

arrays - 为什么线性探测使用相对主要的步骤?

c - 数据在一个内存块中的 ANSI C 哈希表实现

java - 保存为 arraylist 元素的哈希表在分配给 arrayelement 后清除哈希表时会丢失值

c - PEM_read_RSAPrivateKey 函数返回 NULL

c++ - 如何从命令行 (unix) 打印二进制 double 组

c++ - 类似 map 的容器

java - 设计 super 英雄游戏