C 中快速哈希表和动态数组的示例

2025 年 1 月 19 日的文章my reddit comment展示了 C 程序中std::unordered_mapstd::vector的等效技术。这些数据结构的核心重要特性每行代码只需十几行。它们编译快速,在调试构建中往往比 C++等效项的发布构建运行更快。它们在通用性方面的不足由简单性弥补。

  • Allocator:使用简单的碰撞分配器,通过new宏分配内存,可消除 C 程序中的常见缺陷,如类型混淆错误、溢出计算、未初始化内存使用和内存泄漏等,但不满足一些特殊的分配器要求。
  • Strings:使用计数字符串代替经典的空终止字符串,以避免错误。还定义了比较字符串相等的函数equals和字符串哈希函数hash64,后者是 FNV 风格的哈希,将字符数据固定在 0 - 255 以避免char的符号性影响结果。
  • Flat hash map:使用Mask-Step-Index (MSI)哈希表实现字符串到字符串的映射,它在内存使用和速度方面更高效,但有独特键的硬限制,为FlatEnv结构,通过双哈希和开放地址搜索实现查找和插入。
  • Hierarchical hash map:对于键数量无界的情况,使用哈希树,这里使用 4 元树,通过哈希和指针遍历实现查找和插入,零状态下即可使用。
  • String concatenation:添加字符串连接函数concat,用于将字符串连接成envp数据结构,以便在execve(2)中使用,还定义了复制字符串的函数copy,处理特殊的空指针情况。
  • Dynamic arrays:添加动态数组工具,实现std::vector等效功能,通过push宏和push_函数进行插入和扩展数组,处理数组的创建、扩展和内存分配。
  • Putting it all together:定义env_to_envp_env_to_envp函数,用于将Env结构转换为envp数组,递归实现但可能在处理大环境时导致栈溢出,还提供了使用栈数据结构的安全版本env_to_envp_safe,以及讨论了使用链接列表作为替代方法。
  • Hash hardening (bonus):为防止哈希映射的非确定性带来的安全漏洞,通过将哈希函数的种子设置为FlatEnvEnv的地址,并利用地址空间布局随机化 (ASLR) 来增加随机性,使攻击者难以设计碰撞。
    文章的可运行形式代码位于example.c
阅读 8
0 条评论