哈希Table遍历操作

Hash Table traversal operation

我有以下实现的散列 table 指针指向表示活动语音流的结构。

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++;
}

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

parallel_for 是 c++11,不是 c。你真的在用C吗?

从变量名和语音主语进行猜测,假设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( ... ) 做了我刚才描述的事情