【问题标题】:Hash Table traversal operation哈希表遍历操作
【发布时间】:2016-03-11 18:36:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: c data-structures hashtable


    【解决方案1】:

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

    【讨论】:

    • 如果猜测正确,请考虑使用 stackoverflow 的 sphinx 相关标签之一对其进行标记。我没有业力去做那件事
    • 虽然我没有使用 SPHINX 也没有使用上述逻辑和数据结构,但你的回答至少为我指明了实现遍历操作的方向。从而将答案标记为正确。
    【解决方案2】:

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

    【讨论】:

    • 我使用的是C,大写字母只是为了强调编程范式。请删除您的答案并发表评论。
    • 业力不足,无法发表评论。也许很快有一天
    • 既然你在谈论语音,并且引用了一个 hash_table_t 类型,我猜你正在使用 CMU 的 sphinx。要收集哈希表中的所有条目,您必须从 hash_entry_s 列表的头部开始,然后跟随 next 指针,直到找到 NULL,边走边保存每个地址。也许 sphinx 已经有方法可以做到这一点,我只是在看 .h 文件
    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 2014-06-01
    • 2012-04-21
    • 2021-09-29
    • 1970-01-01
    • 2013-11-25
    • 2016-04-12
    • 1970-01-01
    相关资源
    最近更新 更多