@TrisH0x2A: 一个用25行C语言实现的哈希表,FNV-1a处理哈希,从固定值开始,将每个字节与一个素数异或并相乘……

X AI KOLs Timeline 工具

摘要

一个简洁的哈希表实现,使用25行C语言,采用FNV-1a哈希和按位与进行高效的取模运算,通过void指针实现类型通用的存储。

一个用25行C语言实现的哈希表 FNV-1a处理哈希:从一个固定值开始,将每个字节与一个素数异或并相乘,重复此过程。 有趣的是最后一行: 它使用 hash & (cap - 1) 而不是 hash % cap。 当容量是2的幂时,结果相同, 而按位与通常比取模运算更高效。 另一个巧妙的细节是使用void指针存储值: 哈希表不关心你存储什么类型, 整数、字符串、结构体,任何类型都可以。 调用者在存储和检索数据时自行处理类型转换。
查看原文
查看缓存全文

缓存时间: 2026/06/25 05:19

一个25行C代码实现的哈希表

FNV-1a 负责哈希计算,从一个固定值开始,对每个字节进行异或,再乘以一个质数,如此重复。

有趣的部分在最后一行。

它没有使用 hash % cap,而是用了 hash & (cap - 1)。

当容量是2的幂时,结果相同。

而且按位与通常比取模运算开销更低。

另一个巧妙之处是使用了 void 指针来存储值。

哈希表不关心你存储的是什么类型。

整数、字符串、结构体,任何类型都可以。

调用者在存储和读取数据时负责类型转换。

相似文章

值编号

Hacker News Top

本文解释了值编号,一种编译器优化技术,用于识别相同的计算以避免冗余,基于静态单赋值(SSA)形式,并使用哈希合并进行高效比较。

每个字节都很重要

Lobsters Hottest

本文通过Java和C语言的示例,阐述了理解CPU缓存行与数据结构布局对编程性能优化的重要性,讨论了多余字节的开销以及结构体数组与数组结构体之间的权衡。