![]()
82个Star,6次提交,一个让哈希表老兵沉默的Go库。
这是Daniel Lemire的新作constmap。如果你手里有一组固定的字符串键,需要反复查询对应的数字,传统map(映射)的内存开销会让你肉疼——每个键值对动辄几十字节的元数据,缓存行(CPU缓存的最小传输单位)里塞不下几个条目。
constmap的解法很刁钻:用binary fuse filter(二进制熔丝过滤器)把键值对压进一个紧凑数组,查询时1次哈希计算、3次数组访问、2次异或运算,完事。
从布隆过滤器到熔丝过滤器:一场"误报"的退位
布隆过滤器(Bloom Filter)是老熟人——用多个哈希函数把元素映射成位图,查询时可能把"不存在"错判为"存在",这叫假阳性(False Positive)。它省内存,但有两个硬伤:不能存值,只能回答"在不在";假阳性无法消除。
2019年,Lemire和Thomas Mueller Graf提出xor filter(异或过滤器)。思路突变:用3个哈希函数定位3个槽位,把键的指纹异或进这3个位置。查询时取3个槽位异或,若结果匹配指纹则存在。关键是,构造算法能保证零假阳性——只要成功构建,查询结果绝对可靠。
2022年,同一团队再进一步,binary fuse filter(二进制熔丝过滤器)把空间效率推到极致。constmap正是基于这篇ACM期刊论文的实现,每个键值对仅需约9字节。
![]()
9字节 vs 传统map:内存密度的代差
Go的map底层是哈希表,每个桶(bucket)存8个键值对,溢出时用指针链下去。字符串键本身还要堆分配,指针、长度、容量头信息一个不少。实测中,百万级字符串map的内存占用轻松突破百MB。
constmap的构造是一次性的:传入键数组和值数组,算法在后台解一个线性方程组,把每个键的"位置信息"编码进紧凑数组。构造完成后只读,查询路径完全无分支、无指针追逐。
Lemire在代码注释里写得很直白:「Looking up a key that was not in the original set returns an undefined value.」查不存在的键?返回未定义值。这是性能换安全的取舍——如果你需要区分"不存在"和"值为0",得用VerifiedConstMap,内存翻倍到约18字节/键,多存一个指纹做校验。
VerifiedConstMap的哨兵值是0xFFFFFFFFFFFFFFFF,64位全1。这个设计很Go:uint64的最大值作为"未找到"标记,既不牺牲零值语义,又给合法值留足空间。
磁盘序列化:把构造代价摊到一次
binary fuse filter的构造不是免费的。算法要迭代求解,大数据集可能耗时数秒。constmap的应对很工程化:SaveToFile/LoadFromFile支持磁盘序列化,格式带FNV-1a校验和防损坏。
![]()
更灵活的是WriteTo/ReadFrom接口,对接任意io.Writer/io.Reader。你可以把预构造好的映射塞进嵌入式设备的只读存储,或者通过RPC(远程过程调用)流式传输。
一个典型场景:微服务的配置中心。启动时拉取全量配置,构造constmap,本地持久化。下次启动直接加载,跳过构造。查询性能接近数组随机访问,内存占用却比原生map低一个数量级。
代码示例里藏着细节:键必须唯一,键值切片长度必须相等。构造失败会返回error,但成功后的ConstMap是immutable(不可变的)——没有Delete,没有Update,线程安全由"只读"天然保证。
Lemire的学术背景在这类工具库里体现得很充分。从simdjson到fast_float,再到现在的constmap,他的套路一致:找到数据访问的瓶颈点,用算法+SIMD(单指令多数据)或紧凑数据结构硬刚过去。不追求通用性,只求特定场景下的极限性能。
constmap的README末尾留了钩子:「See also the earlier xor filter paper」。如果你只需要判断存在性而不需要取值,xor filter更省空间。这是产品化的克制——不替用户做选择,把决策权交还。
82个Star里有多少人会真的用上?大概率不多。但那个需要处理亿级静态键值对、内存预算卡死的团队,会感谢这个库的存在。
你的项目里,有多少"只读一次、查询千万次"的数据集,还在用原生map硬撑?
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.